omniauth-quickbooks-oauth2-modern 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.rspec +3 -0
- data/.rubocop.yml +14 -0
- data/CHANGELOG.md +17 -0
- data/LICENSE.txt +21 -0
- data/README.md +240 -0
- data/Rakefile +11 -0
- data/lib/omniauth/quickbooks_oauth2_modern/version.rb +7 -0
- data/lib/omniauth/strategies/quickbooks_oauth2_modern.rb +115 -0
- data/lib/omniauth-quickbooks-oauth2-modern.rb +4 -0
- data/omniauth-quickbooks-oauth2-modern.gemspec +47 -0
- metadata +215 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: be89aee453817eeae8a1010d880f1e3573dc56355347c29211f4b2b535e25c4d
|
|
4
|
+
data.tar.gz: 217a086f82719d772996ab2c267f5015718abb6522f4e0daf28a31a50b07e5eb
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 3b866eb508a50c13f73ab54fafaddc423caf683cc44c272c41c4283300e627c8c29be457b89e49c1ba09916c48681db94705fbdd34212e57f0a70a0117d32b73
|
|
7
|
+
data.tar.gz: 0f880dcb6684f6d2818b3be82c44b3dbd097a26ccf5460238ca10b40b6cb2fc3e7305d7ea663db7262eb43333e4f356cb5f2886ddc035f6f3d82b42187401c46
|
data/.rspec
ADDED
data/.rubocop.yml
ADDED
data/CHANGELOG.md
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [1.0.0] - 2026-01-31
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- Initial release with OmniAuth 2.0+ compatibility
|
|
13
|
+
- Support for QuickBooks Online OAuth 2.0 authentication
|
|
14
|
+
- Sandbox and production environment support
|
|
15
|
+
- OpenID Connect userinfo fetching for user details
|
|
16
|
+
- Automatic realm_id (company ID) extraction
|
|
17
|
+
- Comprehensive documentation and examples
|
data/LICENSE.txt
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
The MIT License (MIT)
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 dan1d
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
|
13
|
+
all copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
# OmniAuth QuickBooks OAuth2 Modern
|
|
2
|
+
|
|
3
|
+
An OmniAuth strategy for authenticating with [QuickBooks Online](https://quickbooks.intuit.com/) using OAuth 2.0.
|
|
4
|
+
|
|
5
|
+
**Compatible with OmniAuth 2.0+** - This gem is designed for modern Rails applications using OmniAuth 2.0 or later.
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
Add this line to your application's Gemfile:
|
|
10
|
+
|
|
11
|
+
```ruby
|
|
12
|
+
gem 'omniauth-quickbooks-oauth2-modern'
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Then execute:
|
|
16
|
+
|
|
17
|
+
```shell
|
|
18
|
+
$ bundle install
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Or install it yourself:
|
|
22
|
+
|
|
23
|
+
```shell
|
|
24
|
+
$ gem install omniauth-quickbooks-oauth2-modern
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## QuickBooks Developer Setup
|
|
28
|
+
|
|
29
|
+
1. Go to the [Intuit Developer Portal](https://developer.intuit.com/)
|
|
30
|
+
2. Create a new app or select an existing one
|
|
31
|
+
3. Note your **Client ID** and **Client Secret**
|
|
32
|
+
4. Configure your **Redirect URIs** (e.g., `https://yourapp.com/auth/quickbooks_oauth2_modern/callback`)
|
|
33
|
+
|
|
34
|
+
For more details, read the [QuickBooks OAuth 2.0 documentation](https://developer.intuit.com/app/developer/qbo/docs/develop/authentication-and-authorization/oauth-2.0).
|
|
35
|
+
|
|
36
|
+
## Usage
|
|
37
|
+
|
|
38
|
+
### Standalone OmniAuth
|
|
39
|
+
|
|
40
|
+
Add the middleware to your application in `config/initializers/omniauth.rb`:
|
|
41
|
+
|
|
42
|
+
```ruby
|
|
43
|
+
Rails.application.config.middleware.use OmniAuth::Builder do
|
|
44
|
+
provider :quickbooks_oauth2_modern,
|
|
45
|
+
ENV['QBO_CLIENT_ID'],
|
|
46
|
+
ENV['QBO_CLIENT_SECRET'],
|
|
47
|
+
sandbox: Rails.env.development?,
|
|
48
|
+
scope: 'com.intuit.quickbooks.accounting openid profile email'
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Required for OmniAuth 2.0+
|
|
52
|
+
OmniAuth.config.allowed_request_methods = %i[get post]
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
You can now access the OmniAuth QuickBooks URL at `/auth/quickbooks_oauth2_modern`.
|
|
56
|
+
|
|
57
|
+
### With Devise
|
|
58
|
+
|
|
59
|
+
Add the provider to your Devise configuration in `config/initializers/devise.rb`:
|
|
60
|
+
|
|
61
|
+
```ruby
|
|
62
|
+
config.omniauth :quickbooks_oauth2_modern,
|
|
63
|
+
ENV['QBO_CLIENT_ID'],
|
|
64
|
+
ENV['QBO_CLIENT_SECRET'],
|
|
65
|
+
sandbox: !Rails.env.production?,
|
|
66
|
+
scope: 'com.intuit.quickbooks.accounting openid profile email'
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
**Do not** create a separate `config/initializers/omniauth.rb` file when using Devise.
|
|
70
|
+
|
|
71
|
+
Add to your routes in `config/routes.rb`:
|
|
72
|
+
|
|
73
|
+
```ruby
|
|
74
|
+
devise_for :users, controllers: { omniauth_callbacks: 'users/omniauth_callbacks' }
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Make your User model omniauthable in `app/models/user.rb`:
|
|
78
|
+
|
|
79
|
+
```ruby
|
|
80
|
+
devise :omniauthable, omniauth_providers: [:quickbooks_oauth2_modern]
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Create the callbacks controller at `app/controllers/users/omniauth_callbacks_controller.rb`:
|
|
84
|
+
|
|
85
|
+
```ruby
|
|
86
|
+
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
|
|
87
|
+
def quickbooks_oauth2_modern
|
|
88
|
+
@user = User.from_omniauth(request.env['omniauth.auth'])
|
|
89
|
+
|
|
90
|
+
if @user.persisted?
|
|
91
|
+
flash[:notice] = I18n.t('devise.omniauth_callbacks.success', kind: 'QuickBooks')
|
|
92
|
+
sign_in_and_redirect @user, event: :authentication
|
|
93
|
+
else
|
|
94
|
+
session['devise.quickbooks_data'] = request.env['omniauth.auth'].except('extra')
|
|
95
|
+
redirect_to new_user_registration_url, alert: @user.errors.full_messages.join("\n")
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def failure
|
|
100
|
+
redirect_to root_path, alert: "Authentication failed: #{failure_message}"
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
For your views, create a login button:
|
|
106
|
+
|
|
107
|
+
```erb
|
|
108
|
+
<%= button_to "Sign in with QuickBooks", user_quickbooks_oauth2_modern_omniauth_authorize_path, method: :post %>
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## Configuration Options
|
|
112
|
+
|
|
113
|
+
| Option | Default | Description |
|
|
114
|
+
|--------|---------|-------------|
|
|
115
|
+
| `sandbox` | `true` | Use sandbox environment. Set to `false` for production. |
|
|
116
|
+
| `scope` | `com.intuit.quickbooks.accounting openid profile email` | OAuth scopes to request. |
|
|
117
|
+
| `redirect_uri` | Auto-generated | Custom redirect URI (optional). |
|
|
118
|
+
|
|
119
|
+
### Example with all options:
|
|
120
|
+
|
|
121
|
+
```ruby
|
|
122
|
+
provider :quickbooks_oauth2_modern,
|
|
123
|
+
ENV['QBO_CLIENT_ID'],
|
|
124
|
+
ENV['QBO_CLIENT_SECRET'],
|
|
125
|
+
sandbox: false,
|
|
126
|
+
scope: 'com.intuit.quickbooks.accounting openid profile email',
|
|
127
|
+
redirect_uri: 'https://myapp.com/auth/quickbooks_oauth2_modern/callback'
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## Auth Hash
|
|
131
|
+
|
|
132
|
+
Here's an example of the authentication hash available in the callback via `request.env['omniauth.auth']`:
|
|
133
|
+
|
|
134
|
+
```ruby
|
|
135
|
+
{
|
|
136
|
+
"provider" => "quickbooks_oauth2_modern",
|
|
137
|
+
"uid" => "1234567890", # realmId (company ID)
|
|
138
|
+
"info" => {
|
|
139
|
+
"email" => "user@example.com",
|
|
140
|
+
"first_name" => "John",
|
|
141
|
+
"last_name" => "Doe",
|
|
142
|
+
"name" => "John Doe",
|
|
143
|
+
"phone" => "555-123-4567",
|
|
144
|
+
"realm_id" => "1234567890"
|
|
145
|
+
},
|
|
146
|
+
"credentials" => {
|
|
147
|
+
"token" => "ACCESS_TOKEN",
|
|
148
|
+
"refresh_token" => "REFRESH_TOKEN",
|
|
149
|
+
"expires_at" => 1704067200,
|
|
150
|
+
"expires" => true
|
|
151
|
+
},
|
|
152
|
+
"extra" => {
|
|
153
|
+
"realm_id" => "1234567890",
|
|
154
|
+
"raw_info" => {
|
|
155
|
+
"sub" => "user-uuid",
|
|
156
|
+
"email" => "user@example.com",
|
|
157
|
+
"emailVerified" => true,
|
|
158
|
+
"givenName" => "John",
|
|
159
|
+
"familyName" => "Doe",
|
|
160
|
+
"phoneNumber" => "555-123-4567"
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
## Sandbox vs Production
|
|
167
|
+
|
|
168
|
+
QuickBooks uses different URLs for sandbox and production environments:
|
|
169
|
+
|
|
170
|
+
| Environment | Userinfo URL |
|
|
171
|
+
|-------------|--------------|
|
|
172
|
+
| Sandbox | `https://sandbox-accounts.platform.intuit.com` |
|
|
173
|
+
| Production | `https://accounts.platform.intuit.com` |
|
|
174
|
+
|
|
175
|
+
The gem automatically handles this based on the `sandbox` option.
|
|
176
|
+
|
|
177
|
+
**Important:** You need separate QuickBooks apps for sandbox and production. Make sure to use the correct credentials for each environment.
|
|
178
|
+
|
|
179
|
+
## Token Management
|
|
180
|
+
|
|
181
|
+
QuickBooks access tokens expire after **1 hour**. Refresh tokens are valid for **100 days** with a rolling expiry.
|
|
182
|
+
|
|
183
|
+
Store tokens securely and implement refresh logic:
|
|
184
|
+
|
|
185
|
+
```ruby
|
|
186
|
+
def self.from_omniauth(auth)
|
|
187
|
+
user = where(provider: auth.provider, uid: auth.uid).first_or_create do |u|
|
|
188
|
+
u.email = auth.info.email
|
|
189
|
+
u.password = Devise.friendly_token[0, 20]
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
# Update tokens on each login
|
|
193
|
+
user.update(
|
|
194
|
+
qbo_access_token: auth.credentials.token,
|
|
195
|
+
qbo_refresh_token: auth.credentials.refresh_token,
|
|
196
|
+
qbo_token_expires_at: Time.at(auth.credentials.expires_at),
|
|
197
|
+
qbo_realm_id: auth.info.realm_id
|
|
198
|
+
)
|
|
199
|
+
|
|
200
|
+
user
|
|
201
|
+
end
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
## Scopes
|
|
205
|
+
|
|
206
|
+
Common QuickBooks scopes:
|
|
207
|
+
|
|
208
|
+
| Scope | Description |
|
|
209
|
+
|-------|-------------|
|
|
210
|
+
| `com.intuit.quickbooks.accounting` | Access to QuickBooks Online Accounting API |
|
|
211
|
+
| `com.intuit.quickbooks.payment` | Access to QuickBooks Payments API |
|
|
212
|
+
| `openid` | OpenID Connect (required for userinfo) |
|
|
213
|
+
| `profile` | User profile information |
|
|
214
|
+
| `email` | User email address |
|
|
215
|
+
| `phone` | User phone number |
|
|
216
|
+
| `address` | User address |
|
|
217
|
+
|
|
218
|
+
## Contributing
|
|
219
|
+
|
|
220
|
+
Bug reports and pull requests are welcome on GitHub at [https://github.com/dan1d/omniauth-quickbooks-oauth2-modern](https://github.com/dan1d/omniauth-quickbooks-oauth2-modern).
|
|
221
|
+
|
|
222
|
+
1. Fork it
|
|
223
|
+
2. Create your feature branch (`git checkout -b feature/my-new-feature`)
|
|
224
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
|
225
|
+
4. Push to the branch (`git push origin feature/my-new-feature`)
|
|
226
|
+
5. Create a new Pull Request
|
|
227
|
+
|
|
228
|
+
## Development
|
|
229
|
+
|
|
230
|
+
After checking out the repo, run `bundle install` to install dependencies. Then, run `bundle exec rspec` to run the tests.
|
|
231
|
+
|
|
232
|
+
```shell
|
|
233
|
+
bundle install
|
|
234
|
+
bundle exec rspec
|
|
235
|
+
bundle exec rubocop
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
## License
|
|
239
|
+
|
|
240
|
+
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/Rakefile
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "omniauth-oauth2"
|
|
4
|
+
require "faraday"
|
|
5
|
+
require "json"
|
|
6
|
+
|
|
7
|
+
module OmniAuth
|
|
8
|
+
module Strategies
|
|
9
|
+
# OmniAuth strategy for QuickBooks Online OAuth 2.0
|
|
10
|
+
#
|
|
11
|
+
# This strategy handles QuickBooks' OAuth 2.0 flow with:
|
|
12
|
+
# - Sandbox and production environment support
|
|
13
|
+
# - OpenID Connect userinfo fetching for user details
|
|
14
|
+
# - Proper token refresh handling
|
|
15
|
+
#
|
|
16
|
+
# @example Basic usage with Devise
|
|
17
|
+
# config.omniauth :quickbooks_oauth2_modern,
|
|
18
|
+
# ENV['QBO_CLIENT_ID'],
|
|
19
|
+
# ENV['QBO_CLIENT_SECRET'],
|
|
20
|
+
# sandbox: !Rails.env.production?,
|
|
21
|
+
# scope: 'com.intuit.quickbooks.accounting openid profile email'
|
|
22
|
+
#
|
|
23
|
+
class QuickbooksOauth2Modern < OmniAuth::Strategies::OAuth2
|
|
24
|
+
option :name, :quickbooks_oauth2_modern
|
|
25
|
+
|
|
26
|
+
# Default scopes for QuickBooks accounting access with OpenID
|
|
27
|
+
option :scope, "com.intuit.quickbooks.accounting openid profile email"
|
|
28
|
+
|
|
29
|
+
# Sandbox mode (default: true for safety)
|
|
30
|
+
option :sandbox, true
|
|
31
|
+
|
|
32
|
+
option :client_options, {
|
|
33
|
+
site: "https://appcenter.intuit.com",
|
|
34
|
+
authorize_url: "/connect/oauth2",
|
|
35
|
+
token_url: "https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer"
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
# Use realmId (company ID) as the unique identifier
|
|
39
|
+
uid { realm_id }
|
|
40
|
+
|
|
41
|
+
info do
|
|
42
|
+
{
|
|
43
|
+
email: raw_info["email"],
|
|
44
|
+
first_name: raw_info["givenName"],
|
|
45
|
+
last_name: raw_info["familyName"],
|
|
46
|
+
name: full_name,
|
|
47
|
+
phone: raw_info["phoneNumber"],
|
|
48
|
+
realm_id: realm_id
|
|
49
|
+
}
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
credentials do
|
|
53
|
+
hash = { "token" => access_token.token }
|
|
54
|
+
hash["refresh_token"] = access_token.refresh_token if access_token.refresh_token
|
|
55
|
+
hash["expires_at"] = access_token.expires_at if access_token.expires_at
|
|
56
|
+
hash["expires"] = access_token.expires?
|
|
57
|
+
hash
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
extra do
|
|
61
|
+
{
|
|
62
|
+
realm_id: realm_id,
|
|
63
|
+
raw_info: raw_info
|
|
64
|
+
}
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Fetch user info from OpenID Connect endpoint if available
|
|
68
|
+
def raw_info
|
|
69
|
+
@raw_info ||= fetch_user_info
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Override callback_url to support custom redirect URIs
|
|
73
|
+
def callback_url
|
|
74
|
+
options[:redirect_uri] || (full_host + script_name + callback_path)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
private
|
|
78
|
+
|
|
79
|
+
# The QuickBooks company ID (realmId)
|
|
80
|
+
def realm_id
|
|
81
|
+
request.params["realmId"]
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# Construct full name from OpenID info
|
|
85
|
+
def full_name
|
|
86
|
+
name = [raw_info["givenName"], raw_info["familyName"]].compact.join(" ")
|
|
87
|
+
name.empty? ? nil : name
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# Fetch user info from OpenID Connect userinfo endpoint
|
|
91
|
+
# Only available if 'openid' scope was requested
|
|
92
|
+
def fetch_user_info
|
|
93
|
+
return {} unless openid_scope_requested?
|
|
94
|
+
|
|
95
|
+
response = access_token.get(userinfo_url)
|
|
96
|
+
JSON.parse(response.body)
|
|
97
|
+
rescue StandardError => e
|
|
98
|
+
log(:error, "Failed to fetch userinfo: #{e.message}")
|
|
99
|
+
{}
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
# Check if OpenID scopes were requested
|
|
103
|
+
def openid_scope_requested?
|
|
104
|
+
scope = options[:scope] || ""
|
|
105
|
+
scope.split(/\s+/).include?("openid")
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# Get the appropriate userinfo URL based on environment
|
|
109
|
+
def userinfo_url
|
|
110
|
+
domain = options[:sandbox] ? "sandbox-accounts.platform.intuit.com" : "accounts.platform.intuit.com"
|
|
111
|
+
"https://#{domain}/v1/openid_connect/userinfo"
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "lib/omniauth/quickbooks_oauth2_modern/version"
|
|
4
|
+
|
|
5
|
+
Gem::Specification.new do |spec|
|
|
6
|
+
spec.name = "omniauth-quickbooks-oauth2-modern"
|
|
7
|
+
spec.version = OmniAuth::QuickbooksOauth2Modern::VERSION
|
|
8
|
+
spec.authors = ["dan1d"]
|
|
9
|
+
spec.email = ["dan@theowner.me"]
|
|
10
|
+
|
|
11
|
+
spec.summary = "OmniAuth strategy for QuickBooks Online OAuth 2.0 (OmniAuth 2.0+ compatible)"
|
|
12
|
+
spec.description = "An OmniAuth strategy for authenticating with QuickBooks Online using OAuth 2.0. " \
|
|
13
|
+
"Compatible with OmniAuth 2.0+ and supports both sandbox and production environments " \
|
|
14
|
+
"with OpenID Connect userinfo fetching."
|
|
15
|
+
spec.homepage = "https://github.com/dan1d/omniauth-quickbooks-oauth2-modern"
|
|
16
|
+
spec.license = "MIT"
|
|
17
|
+
spec.required_ruby_version = ">= 3.0.0"
|
|
18
|
+
|
|
19
|
+
spec.metadata["homepage_uri"] = spec.homepage
|
|
20
|
+
spec.metadata["source_code_uri"] = spec.homepage
|
|
21
|
+
spec.metadata["changelog_uri"] = "#{spec.homepage}/blob/main/CHANGELOG.md"
|
|
22
|
+
|
|
23
|
+
spec.files = Dir.chdir(__dir__) do
|
|
24
|
+
`git ls-files -z`.split("\x0").reject do |f|
|
|
25
|
+
(File.expand_path(f) == __FILE__) ||
|
|
26
|
+
f.start_with?(*%w[bin/ test/ spec/ features/ .git .github appveyor Gemfile])
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
spec.bindir = "exe"
|
|
30
|
+
spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
|
|
31
|
+
spec.require_paths = ["lib"]
|
|
32
|
+
|
|
33
|
+
# Runtime dependencies
|
|
34
|
+
spec.add_dependency "faraday", ">= 1.0", "< 3.0"
|
|
35
|
+
spec.add_dependency "omniauth", "~> 2.0"
|
|
36
|
+
spec.add_dependency "omniauth-oauth2", "~> 1.8"
|
|
37
|
+
|
|
38
|
+
# Development dependencies
|
|
39
|
+
spec.add_development_dependency "bundler", "~> 2.0"
|
|
40
|
+
spec.add_development_dependency "rack-test", "~> 2.1"
|
|
41
|
+
spec.add_development_dependency "rake", "~> 13.0"
|
|
42
|
+
spec.add_development_dependency "rspec", "~> 3.12"
|
|
43
|
+
spec.add_development_dependency "rubocop", "~> 1.50"
|
|
44
|
+
spec.add_development_dependency "rubocop-rspec", "~> 2.20"
|
|
45
|
+
spec.add_development_dependency "simplecov", "~> 0.22"
|
|
46
|
+
spec.add_development_dependency "webmock", "~> 3.18"
|
|
47
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: omniauth-quickbooks-oauth2-modern
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- dan1d
|
|
8
|
+
bindir: exe
|
|
9
|
+
cert_chain: []
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
|
+
dependencies:
|
|
12
|
+
- !ruby/object:Gem::Dependency
|
|
13
|
+
name: faraday
|
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
|
15
|
+
requirements:
|
|
16
|
+
- - ">="
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: '1.0'
|
|
19
|
+
- - "<"
|
|
20
|
+
- !ruby/object:Gem::Version
|
|
21
|
+
version: '3.0'
|
|
22
|
+
type: :runtime
|
|
23
|
+
prerelease: false
|
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
25
|
+
requirements:
|
|
26
|
+
- - ">="
|
|
27
|
+
- !ruby/object:Gem::Version
|
|
28
|
+
version: '1.0'
|
|
29
|
+
- - "<"
|
|
30
|
+
- !ruby/object:Gem::Version
|
|
31
|
+
version: '3.0'
|
|
32
|
+
- !ruby/object:Gem::Dependency
|
|
33
|
+
name: omniauth
|
|
34
|
+
requirement: !ruby/object:Gem::Requirement
|
|
35
|
+
requirements:
|
|
36
|
+
- - "~>"
|
|
37
|
+
- !ruby/object:Gem::Version
|
|
38
|
+
version: '2.0'
|
|
39
|
+
type: :runtime
|
|
40
|
+
prerelease: false
|
|
41
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
42
|
+
requirements:
|
|
43
|
+
- - "~>"
|
|
44
|
+
- !ruby/object:Gem::Version
|
|
45
|
+
version: '2.0'
|
|
46
|
+
- !ruby/object:Gem::Dependency
|
|
47
|
+
name: omniauth-oauth2
|
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
|
49
|
+
requirements:
|
|
50
|
+
- - "~>"
|
|
51
|
+
- !ruby/object:Gem::Version
|
|
52
|
+
version: '1.8'
|
|
53
|
+
type: :runtime
|
|
54
|
+
prerelease: false
|
|
55
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
56
|
+
requirements:
|
|
57
|
+
- - "~>"
|
|
58
|
+
- !ruby/object:Gem::Version
|
|
59
|
+
version: '1.8'
|
|
60
|
+
- !ruby/object:Gem::Dependency
|
|
61
|
+
name: bundler
|
|
62
|
+
requirement: !ruby/object:Gem::Requirement
|
|
63
|
+
requirements:
|
|
64
|
+
- - "~>"
|
|
65
|
+
- !ruby/object:Gem::Version
|
|
66
|
+
version: '2.0'
|
|
67
|
+
type: :development
|
|
68
|
+
prerelease: false
|
|
69
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
70
|
+
requirements:
|
|
71
|
+
- - "~>"
|
|
72
|
+
- !ruby/object:Gem::Version
|
|
73
|
+
version: '2.0'
|
|
74
|
+
- !ruby/object:Gem::Dependency
|
|
75
|
+
name: rack-test
|
|
76
|
+
requirement: !ruby/object:Gem::Requirement
|
|
77
|
+
requirements:
|
|
78
|
+
- - "~>"
|
|
79
|
+
- !ruby/object:Gem::Version
|
|
80
|
+
version: '2.1'
|
|
81
|
+
type: :development
|
|
82
|
+
prerelease: false
|
|
83
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
84
|
+
requirements:
|
|
85
|
+
- - "~>"
|
|
86
|
+
- !ruby/object:Gem::Version
|
|
87
|
+
version: '2.1'
|
|
88
|
+
- !ruby/object:Gem::Dependency
|
|
89
|
+
name: rake
|
|
90
|
+
requirement: !ruby/object:Gem::Requirement
|
|
91
|
+
requirements:
|
|
92
|
+
- - "~>"
|
|
93
|
+
- !ruby/object:Gem::Version
|
|
94
|
+
version: '13.0'
|
|
95
|
+
type: :development
|
|
96
|
+
prerelease: false
|
|
97
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
98
|
+
requirements:
|
|
99
|
+
- - "~>"
|
|
100
|
+
- !ruby/object:Gem::Version
|
|
101
|
+
version: '13.0'
|
|
102
|
+
- !ruby/object:Gem::Dependency
|
|
103
|
+
name: rspec
|
|
104
|
+
requirement: !ruby/object:Gem::Requirement
|
|
105
|
+
requirements:
|
|
106
|
+
- - "~>"
|
|
107
|
+
- !ruby/object:Gem::Version
|
|
108
|
+
version: '3.12'
|
|
109
|
+
type: :development
|
|
110
|
+
prerelease: false
|
|
111
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
112
|
+
requirements:
|
|
113
|
+
- - "~>"
|
|
114
|
+
- !ruby/object:Gem::Version
|
|
115
|
+
version: '3.12'
|
|
116
|
+
- !ruby/object:Gem::Dependency
|
|
117
|
+
name: rubocop
|
|
118
|
+
requirement: !ruby/object:Gem::Requirement
|
|
119
|
+
requirements:
|
|
120
|
+
- - "~>"
|
|
121
|
+
- !ruby/object:Gem::Version
|
|
122
|
+
version: '1.50'
|
|
123
|
+
type: :development
|
|
124
|
+
prerelease: false
|
|
125
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
126
|
+
requirements:
|
|
127
|
+
- - "~>"
|
|
128
|
+
- !ruby/object:Gem::Version
|
|
129
|
+
version: '1.50'
|
|
130
|
+
- !ruby/object:Gem::Dependency
|
|
131
|
+
name: rubocop-rspec
|
|
132
|
+
requirement: !ruby/object:Gem::Requirement
|
|
133
|
+
requirements:
|
|
134
|
+
- - "~>"
|
|
135
|
+
- !ruby/object:Gem::Version
|
|
136
|
+
version: '2.20'
|
|
137
|
+
type: :development
|
|
138
|
+
prerelease: false
|
|
139
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
140
|
+
requirements:
|
|
141
|
+
- - "~>"
|
|
142
|
+
- !ruby/object:Gem::Version
|
|
143
|
+
version: '2.20'
|
|
144
|
+
- !ruby/object:Gem::Dependency
|
|
145
|
+
name: simplecov
|
|
146
|
+
requirement: !ruby/object:Gem::Requirement
|
|
147
|
+
requirements:
|
|
148
|
+
- - "~>"
|
|
149
|
+
- !ruby/object:Gem::Version
|
|
150
|
+
version: '0.22'
|
|
151
|
+
type: :development
|
|
152
|
+
prerelease: false
|
|
153
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
154
|
+
requirements:
|
|
155
|
+
- - "~>"
|
|
156
|
+
- !ruby/object:Gem::Version
|
|
157
|
+
version: '0.22'
|
|
158
|
+
- !ruby/object:Gem::Dependency
|
|
159
|
+
name: webmock
|
|
160
|
+
requirement: !ruby/object:Gem::Requirement
|
|
161
|
+
requirements:
|
|
162
|
+
- - "~>"
|
|
163
|
+
- !ruby/object:Gem::Version
|
|
164
|
+
version: '3.18'
|
|
165
|
+
type: :development
|
|
166
|
+
prerelease: false
|
|
167
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
168
|
+
requirements:
|
|
169
|
+
- - "~>"
|
|
170
|
+
- !ruby/object:Gem::Version
|
|
171
|
+
version: '3.18'
|
|
172
|
+
description: An OmniAuth strategy for authenticating with QuickBooks Online using
|
|
173
|
+
OAuth 2.0. Compatible with OmniAuth 2.0+ and supports both sandbox and production
|
|
174
|
+
environments with OpenID Connect userinfo fetching.
|
|
175
|
+
email:
|
|
176
|
+
- dan@theowner.me
|
|
177
|
+
executables: []
|
|
178
|
+
extensions: []
|
|
179
|
+
extra_rdoc_files: []
|
|
180
|
+
files:
|
|
181
|
+
- ".rspec"
|
|
182
|
+
- ".rubocop.yml"
|
|
183
|
+
- CHANGELOG.md
|
|
184
|
+
- LICENSE.txt
|
|
185
|
+
- README.md
|
|
186
|
+
- Rakefile
|
|
187
|
+
- lib/omniauth-quickbooks-oauth2-modern.rb
|
|
188
|
+
- lib/omniauth/quickbooks_oauth2_modern/version.rb
|
|
189
|
+
- lib/omniauth/strategies/quickbooks_oauth2_modern.rb
|
|
190
|
+
- omniauth-quickbooks-oauth2-modern.gemspec
|
|
191
|
+
homepage: https://github.com/dan1d/omniauth-quickbooks-oauth2-modern
|
|
192
|
+
licenses:
|
|
193
|
+
- MIT
|
|
194
|
+
metadata:
|
|
195
|
+
homepage_uri: https://github.com/dan1d/omniauth-quickbooks-oauth2-modern
|
|
196
|
+
source_code_uri: https://github.com/dan1d/omniauth-quickbooks-oauth2-modern
|
|
197
|
+
changelog_uri: https://github.com/dan1d/omniauth-quickbooks-oauth2-modern/blob/main/CHANGELOG.md
|
|
198
|
+
rdoc_options: []
|
|
199
|
+
require_paths:
|
|
200
|
+
- lib
|
|
201
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
202
|
+
requirements:
|
|
203
|
+
- - ">="
|
|
204
|
+
- !ruby/object:Gem::Version
|
|
205
|
+
version: 3.0.0
|
|
206
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
207
|
+
requirements:
|
|
208
|
+
- - ">="
|
|
209
|
+
- !ruby/object:Gem::Version
|
|
210
|
+
version: '0'
|
|
211
|
+
requirements: []
|
|
212
|
+
rubygems_version: 3.6.9
|
|
213
|
+
specification_version: 4
|
|
214
|
+
summary: OmniAuth strategy for QuickBooks Online OAuth 2.0 (OmniAuth 2.0+ compatible)
|
|
215
|
+
test_files: []
|