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 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
@@ -0,0 +1,3 @@
1
+ --require spec_helper
2
+ --format documentation
3
+ --color
data/.rubocop.yml ADDED
@@ -0,0 +1,14 @@
1
+ AllCops:
2
+ TargetRubyVersion: 3.0
3
+ NewCops: enable
4
+ Exclude:
5
+ - "vendor/**/*"
6
+ - "spec/**/*"
7
+
8
+ Style/Documentation:
9
+ Enabled: false
10
+
11
+ Metrics/BlockLength:
12
+ Exclude:
13
+ - "spec/**/*"
14
+ - "*.gemspec"
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,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ require "rspec/core/rake_task"
5
+
6
+ RSpec::Core::RakeTask.new(:spec)
7
+
8
+ require "rubocop/rake_task"
9
+ RuboCop::RakeTask.new
10
+
11
+ task default: %i[spec rubocop]
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OmniAuth
4
+ module QuickbooksOauth2Modern
5
+ VERSION = "1.0.0"
6
+ end
7
+ end
@@ -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,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "omniauth/quickbooks_oauth2_modern/version"
4
+ require "omniauth/strategies/quickbooks_oauth2_modern"
@@ -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: []