doorkeeper 4.2.5 → 5.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 +4 -4
- data/.github/ISSUE_TEMPLATE.md +25 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +17 -0
- data/.gitignore +2 -1
- data/.gitlab-ci.yml +16 -0
- data/.hound.yml +2 -13
- data/.rubocop.yml +17 -0
- data/.travis.yml +19 -4
- data/Appraisals +8 -4
- data/CODE_OF_CONDUCT.md +46 -0
- data/Gemfile +1 -1
- data/NEWS.md +115 -0
- data/README.md +175 -39
- data/RELEASING.md +5 -12
- data/Rakefile +6 -0
- data/SECURITY.md +15 -0
- data/UPGRADE.md +2 -0
- data/app/assets/stylesheets/doorkeeper/admin/application.css +2 -2
- data/app/controllers/doorkeeper/application_controller.rb +2 -5
- data/app/controllers/doorkeeper/application_metal_controller.rb +4 -0
- data/app/controllers/doorkeeper/applications_controller.rb +47 -13
- data/app/controllers/doorkeeper/authorizations_controller.rb +55 -12
- data/app/controllers/doorkeeper/authorized_applications_controller.rb +19 -2
- data/app/controllers/doorkeeper/tokens_controller.rb +24 -17
- data/app/helpers/doorkeeper/dashboard_helper.rb +8 -6
- data/app/validators/redirect_uri_validator.rb +13 -2
- data/app/views/doorkeeper/applications/_delete_form.html.erb +3 -1
- data/app/views/doorkeeper/applications/_form.html.erb +31 -19
- data/app/views/doorkeeper/applications/edit.html.erb +1 -1
- data/app/views/doorkeeper/applications/index.html.erb +18 -6
- data/app/views/doorkeeper/applications/new.html.erb +1 -1
- data/app/views/doorkeeper/applications/show.html.erb +8 -5
- data/app/views/doorkeeper/authorizations/error.html.erb +1 -1
- data/app/views/doorkeeper/authorizations/new.html.erb +5 -1
- data/app/views/doorkeeper/authorized_applications/index.html.erb +0 -1
- data/app/views/layouts/doorkeeper/admin.html.erb +15 -15
- data/config/locales/en.yml +19 -6
- data/doorkeeper.gemspec +20 -20
- data/gemfiles/rails_4_2.gemfile +6 -4
- data/gemfiles/rails_5_0.gemfile +4 -4
- data/gemfiles/rails_5_1.gemfile +6 -7
- data/gemfiles/rails_5_2.gemfile +12 -0
- data/gemfiles/rails_master.gemfile +17 -0
- data/lib/doorkeeper/config.rb +123 -71
- data/lib/doorkeeper/engine.rb +7 -3
- data/lib/doorkeeper/errors.rb +20 -5
- data/lib/doorkeeper/grape/helpers.rb +14 -9
- data/lib/doorkeeper/helpers/controller.rb +16 -22
- data/lib/doorkeeper/models/access_grant_mixin.rb +67 -23
- data/lib/doorkeeper/models/access_token_mixin.rb +54 -55
- data/lib/doorkeeper/models/application_mixin.rb +16 -30
- data/lib/doorkeeper/models/concerns/expirable.rb +7 -5
- data/lib/doorkeeper/models/concerns/orderable.rb +13 -0
- data/lib/doorkeeper/models/concerns/scopes.rb +1 -1
- data/lib/doorkeeper/oauth/authorization/code.rb +31 -8
- data/lib/doorkeeper/oauth/authorization/context.rb +15 -0
- data/lib/doorkeeper/oauth/authorization/token.rb +46 -20
- data/lib/doorkeeper/oauth/authorization_code_request.rb +33 -3
- data/lib/doorkeeper/oauth/base_request.rb +23 -7
- data/lib/doorkeeper/oauth/client/credentials.rb +6 -4
- data/lib/doorkeeper/oauth/client.rb +2 -4
- data/lib/doorkeeper/oauth/client_credentials/creator.rb +2 -1
- data/lib/doorkeeper/oauth/client_credentials/issuer.rb +6 -3
- data/lib/doorkeeper/oauth/client_credentials/validation.rb +4 -6
- data/lib/doorkeeper/oauth/client_credentials_request.rb +0 -4
- data/lib/doorkeeper/oauth/error.rb +2 -2
- data/lib/doorkeeper/oauth/error_response.rb +11 -4
- data/lib/doorkeeper/oauth/forbidden_token_response.rb +1 -1
- data/lib/doorkeeper/oauth/helpers/scope_checker.rb +0 -8
- data/lib/doorkeeper/oauth/helpers/uri_checker.rb +15 -0
- data/lib/doorkeeper/oauth/invalid_token_response.rb +3 -4
- data/lib/doorkeeper/oauth/password_access_token_request.rb +8 -4
- data/lib/doorkeeper/oauth/pre_authorization.rb +45 -13
- data/lib/doorkeeper/oauth/refresh_token_request.rb +7 -1
- data/lib/doorkeeper/oauth/scopes.rb +19 -9
- data/lib/doorkeeper/oauth/token.rb +6 -3
- data/lib/doorkeeper/oauth/token_introspection.rb +128 -0
- data/lib/doorkeeper/oauth/token_response.rb +4 -2
- data/lib/doorkeeper/oauth.rb +13 -0
- data/lib/doorkeeper/orm/active_record/access_grant.rb +27 -0
- data/lib/doorkeeper/orm/active_record/access_token.rb +21 -20
- data/lib/doorkeeper/orm/active_record/application.rb +45 -0
- data/lib/doorkeeper/orm/active_record/stale_records_cleaner.rb +26 -0
- data/lib/doorkeeper/orm/active_record.rb +21 -8
- data/lib/doorkeeper/rails/helpers.rb +7 -10
- data/lib/doorkeeper/rails/routes.rb +21 -7
- data/lib/doorkeeper/rake/db.rake +40 -0
- data/lib/doorkeeper/rake/setup.rake +6 -0
- data/lib/doorkeeper/rake.rb +14 -0
- data/lib/doorkeeper/request/authorization_code.rb +0 -2
- data/lib/doorkeeper/request/client_credentials.rb +0 -2
- data/lib/doorkeeper/request/code.rb +0 -2
- data/lib/doorkeeper/request/password.rb +1 -13
- data/lib/doorkeeper/request/refresh_token.rb +0 -2
- data/lib/doorkeeper/request/token.rb +0 -2
- data/lib/doorkeeper/request.rb +29 -30
- data/lib/doorkeeper/validations.rb +3 -2
- data/lib/doorkeeper/version.rb +14 -1
- data/lib/doorkeeper.rb +21 -17
- data/lib/generators/doorkeeper/application_owner_generator.rb +26 -12
- data/lib/generators/doorkeeper/confidential_applications_generator.rb +32 -0
- data/lib/generators/doorkeeper/install_generator.rb +17 -9
- data/lib/generators/doorkeeper/migration_generator.rb +26 -9
- data/lib/generators/doorkeeper/pkce_generator.rb +32 -0
- data/lib/generators/doorkeeper/previous_refresh_token_generator.rb +31 -20
- data/lib/generators/doorkeeper/templates/add_confidential_to_applications.rb.erb +13 -0
- data/lib/generators/doorkeeper/templates/{add_owner_to_application_migration.rb → add_owner_to_application_migration.rb.erb} +1 -1
- data/lib/generators/doorkeeper/templates/{add_previous_refresh_token_to_access_tokens.rb → add_previous_refresh_token_to_access_tokens.rb.erb} +1 -1
- data/lib/generators/doorkeeper/templates/enable_pkce_migration.rb.erb +6 -0
- data/lib/generators/doorkeeper/templates/initializer.rb +104 -12
- data/lib/generators/doorkeeper/templates/{migration.rb → migration.rb.erb} +2 -1
- data/lib/generators/doorkeeper/views_generator.rb +3 -1
- data/spec/controllers/application_metal_controller_spec.rb +50 -0
- data/spec/controllers/applications_controller_spec.rb +141 -17
- data/spec/controllers/authorizations_controller_spec.rb +304 -27
- data/spec/controllers/protected_resources_controller_spec.rb +44 -35
- data/spec/controllers/token_info_controller_spec.rb +17 -21
- data/spec/controllers/tokens_controller_spec.rb +201 -17
- data/spec/dummy/app/assets/config/manifest.js +2 -0
- data/spec/dummy/config/environments/test.rb +4 -5
- data/spec/dummy/config/initializers/doorkeeper.rb +23 -2
- data/spec/dummy/config/initializers/{active_record_belongs_to_required_by_default.rb → new_framework_defaults.rb} +5 -1
- data/spec/dummy/config/initializers/secret_token.rb +0 -1
- data/spec/dummy/config/routes.rb +3 -42
- data/spec/dummy/db/migrate/20111122132257_create_users.rb +3 -1
- data/spec/dummy/db/migrate/20120312140401_add_password_to_users.rb +3 -1
- data/spec/dummy/db/migrate/20151223192035_create_doorkeeper_tables.rb +3 -1
- data/spec/dummy/db/migrate/20151223200000_add_owner_to_application.rb +3 -1
- data/spec/dummy/db/migrate/20160320211015_add_previous_refresh_token_to_access_tokens.rb +3 -1
- data/spec/dummy/db/migrate/20170822064514_enable_pkce.rb +6 -0
- data/spec/dummy/db/migrate/20180210183654_add_confidential_to_applications.rb +13 -0
- data/spec/dummy/db/schema.rb +38 -37
- data/spec/factories.rb +1 -1
- data/spec/generators/application_owner_generator_spec.rb +25 -6
- data/spec/generators/confidential_applications_generator_spec.rb +45 -0
- data/spec/generators/install_generator_spec.rb +1 -1
- data/spec/generators/migration_generator_spec.rb +25 -4
- data/spec/generators/pkce_generator_spec.rb +43 -0
- data/spec/generators/previous_refresh_token_generator_spec.rb +57 -0
- data/spec/generators/views_generator_spec.rb +1 -1
- data/spec/grape/grape_integration_spec.rb +135 -0
- data/spec/helpers/doorkeeper/dashboard_helper_spec.rb +2 -2
- data/spec/lib/config_spec.rb +199 -22
- data/spec/lib/doorkeeper_spec.rb +1 -126
- data/spec/lib/models/expirable_spec.rb +0 -4
- data/spec/lib/models/revocable_spec.rb +2 -4
- data/spec/lib/models/scopes_spec.rb +0 -4
- data/spec/lib/oauth/authorization/uri_builder_spec.rb +0 -4
- data/spec/lib/oauth/authorization_code_request_spec.rb +63 -13
- data/spec/lib/oauth/base_request_spec.rb +43 -10
- data/spec/lib/oauth/base_response_spec.rb +1 -1
- data/spec/lib/oauth/client/credentials_spec.rb +5 -5
- data/spec/lib/oauth/client_credentials/creator_spec.rb +6 -2
- data/spec/lib/oauth/client_credentials/issuer_spec.rb +26 -7
- data/spec/lib/oauth/client_credentials/validation_spec.rb +2 -3
- data/spec/lib/oauth/client_credentials_integration_spec.rb +2 -2
- data/spec/lib/oauth/client_credentials_request_spec.rb +4 -5
- data/spec/lib/oauth/client_spec.rb +0 -3
- data/spec/lib/oauth/code_request_spec.rb +5 -5
- data/spec/lib/oauth/error_response_spec.rb +0 -3
- data/spec/lib/oauth/error_spec.rb +1 -3
- data/spec/lib/oauth/forbidden_token_response_spec.rb +1 -4
- data/spec/lib/oauth/helpers/scope_checker_spec.rb +0 -3
- data/spec/lib/oauth/helpers/unique_token_spec.rb +0 -1
- data/spec/lib/oauth/helpers/uri_checker_spec.rb +115 -3
- data/spec/lib/oauth/invalid_token_response_spec.rb +2 -5
- data/spec/lib/oauth/password_access_token_request_spec.rb +46 -5
- data/spec/lib/oauth/pre_authorization_spec.rb +40 -6
- data/spec/lib/oauth/refresh_token_request_spec.rb +30 -14
- data/spec/lib/oauth/scopes_spec.rb +28 -4
- data/spec/lib/oauth/token_request_spec.rb +10 -13
- data/spec/lib/oauth/token_response_spec.rb +0 -1
- data/spec/lib/oauth/token_spec.rb +37 -14
- data/spec/lib/orm/active_record/stale_records_cleaner_spec.rb +79 -0
- data/spec/lib/request/strategy_spec.rb +0 -1
- data/spec/lib/server_spec.rb +10 -0
- data/spec/models/doorkeeper/access_grant_spec.rb +45 -2
- data/spec/models/doorkeeper/access_token_spec.rb +132 -64
- data/spec/models/doorkeeper/application_spec.rb +114 -23
- data/spec/requests/applications/applications_request_spec.rb +139 -6
- data/spec/requests/applications/authorized_applications_spec.rb +1 -1
- data/spec/requests/endpoints/authorization_spec.rb +1 -1
- data/spec/requests/endpoints/token_spec.rb +15 -6
- data/spec/requests/flows/authorization_code_errors_spec.rb +12 -2
- data/spec/requests/flows/authorization_code_spec.rb +199 -2
- data/spec/requests/flows/client_credentials_spec.rb +73 -5
- data/spec/requests/flows/implicit_grant_errors_spec.rb +3 -3
- data/spec/requests/flows/implicit_grant_spec.rb +38 -11
- data/spec/requests/flows/password_spec.rb +160 -24
- data/spec/requests/flows/refresh_token_spec.rb +6 -6
- data/spec/requests/flows/revoke_token_spec.rb +26 -26
- data/spec/requests/flows/skip_authorization_spec.rb +16 -11
- data/spec/requests/protected_resources/metal_spec.rb +2 -2
- data/spec/requests/protected_resources/private_api_spec.rb +2 -2
- data/spec/routing/custom_controller_routes_spec.rb +63 -7
- data/spec/routing/default_routes_spec.rb +6 -2
- data/spec/routing/scoped_routes_spec.rb +16 -2
- data/spec/spec_helper.rb +54 -3
- data/spec/spec_helper_integration.rb +2 -64
- data/spec/support/dependencies/factory_bot.rb +2 -0
- data/spec/support/doorkeeper_rspec.rb +19 -0
- data/spec/support/helpers/access_token_request_helper.rb +1 -1
- data/spec/support/helpers/authorization_request_helper.rb +4 -4
- data/spec/support/helpers/model_helper.rb +9 -4
- data/spec/support/helpers/request_spec_helper.rb +18 -6
- data/spec/support/helpers/url_helper.rb +15 -10
- data/spec/support/http_method_shim.rb +12 -16
- data/spec/support/shared/controllers_shared_context.rb +2 -6
- data/spec/support/shared/models_shared_examples.rb +4 -4
- data/spec/validators/redirect_uri_validator_spec.rb +58 -7
- data/spec/version/version_spec.rb +15 -0
- data/vendor/assets/stylesheets/doorkeeper/bootstrap.min.css +4 -5
- metadata +75 -33
- data/spec/controllers/application_metal_controller.rb +0 -10
- data/spec/support/dependencies/factory_girl.rb +0 -2
data/doorkeeper.gemspec
CHANGED
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
$LOAD_PATH.push File.expand_path(
|
|
1
|
+
$LOAD_PATH.push File.expand_path('../lib', __FILE__)
|
|
2
2
|
|
|
3
|
-
require
|
|
3
|
+
require 'doorkeeper/version'
|
|
4
4
|
|
|
5
5
|
Gem::Specification.new do |s|
|
|
6
|
-
s.name =
|
|
7
|
-
s.version = Doorkeeper
|
|
8
|
-
s.authors = [
|
|
9
|
-
s.email = %w(
|
|
10
|
-
s.homepage =
|
|
11
|
-
s.summary =
|
|
12
|
-
s.description =
|
|
6
|
+
s.name = 'doorkeeper'
|
|
7
|
+
s.version = Doorkeeper.gem_version
|
|
8
|
+
s.authors = ['Felipe Elias Philipp', 'Tute Costa', 'Jon Moss', 'Nikita Bulai']
|
|
9
|
+
s.email = %w(bulaj.nikita@gmail.com)
|
|
10
|
+
s.homepage = 'https://github.com/doorkeeper-gem/doorkeeper'
|
|
11
|
+
s.summary = 'OAuth 2 provider for Rails and Grape'
|
|
12
|
+
s.description = 'Doorkeeper is an OAuth 2 provider for Rails and Grape.'
|
|
13
13
|
s.license = 'MIT'
|
|
14
14
|
|
|
15
15
|
s.files = `git ls-files`.split("\n")
|
|
16
16
|
s.test_files = `git ls-files -- spec/*`.split("\n")
|
|
17
|
-
s.require_paths = [
|
|
17
|
+
s.require_paths = ['lib']
|
|
18
18
|
|
|
19
|
-
s.add_dependency
|
|
20
|
-
s.required_ruby_version =
|
|
19
|
+
s.add_dependency 'railties', '>= 4.2'
|
|
20
|
+
s.required_ruby_version = '>= 2.1'
|
|
21
21
|
|
|
22
|
-
s.add_development_dependency
|
|
23
|
-
s.add_development_dependency
|
|
24
|
-
s.add_development_dependency
|
|
25
|
-
s.add_development_dependency
|
|
26
|
-
s.add_development_dependency
|
|
27
|
-
s.add_development_dependency
|
|
28
|
-
s.add_development_dependency
|
|
29
|
-
s.add_development_dependency
|
|
22
|
+
s.add_development_dependency 'capybara', '~> 2.18'
|
|
23
|
+
s.add_development_dependency 'coveralls'
|
|
24
|
+
s.add_development_dependency 'grape'
|
|
25
|
+
s.add_development_dependency 'database_cleaner', '~> 1.6'
|
|
26
|
+
s.add_development_dependency 'factory_bot', '~> 4.8'
|
|
27
|
+
s.add_development_dependency 'generator_spec', '~> 0.9.3'
|
|
28
|
+
s.add_development_dependency 'rake', '>= 11.3.0'
|
|
29
|
+
s.add_development_dependency 'rspec-rails'
|
|
30
30
|
end
|
data/gemfiles/rails_4_2.gemfile
CHANGED
|
@@ -4,8 +4,10 @@ source "https://rubygems.org"
|
|
|
4
4
|
|
|
5
5
|
gem "rails", "~> 4.2.0"
|
|
6
6
|
gem "appraisal"
|
|
7
|
-
gem "activerecord-jdbcsqlite3-adapter", :
|
|
8
|
-
gem "sqlite3", :
|
|
9
|
-
gem "tzinfo-data", :
|
|
7
|
+
gem "activerecord-jdbcsqlite3-adapter", platform: :jruby
|
|
8
|
+
gem "sqlite3", platform: [:ruby, :mswin, :mingw, :x64_mingw]
|
|
9
|
+
gem "tzinfo-data", platforms: [:mingw, :mswin, :x64_mingw]
|
|
10
|
+
# Older Grape requires Ruby >= 2.2.2
|
|
11
|
+
gem "grape", '~> 0.16', '< 0.19.2'
|
|
10
12
|
|
|
11
|
-
gemspec :
|
|
13
|
+
gemspec path: "../"
|
data/gemfiles/rails_5_0.gemfile
CHANGED
|
@@ -4,9 +4,9 @@ source "https://rubygems.org"
|
|
|
4
4
|
|
|
5
5
|
gem "rails", "~> 5.0.0"
|
|
6
6
|
gem "appraisal"
|
|
7
|
-
gem "activerecord-jdbcsqlite3-adapter", :
|
|
8
|
-
gem "sqlite3", :
|
|
9
|
-
gem "tzinfo-data", :
|
|
7
|
+
gem "activerecord-jdbcsqlite3-adapter", platforms: :jruby
|
|
8
|
+
gem "sqlite3", platforms: [:ruby, :mswin, :mingw, :x64_mingw]
|
|
9
|
+
gem "tzinfo-data", platforms: [:mingw, :mswin, :x64_mingw]
|
|
10
10
|
gem "rspec-rails", "~> 3.5"
|
|
11
11
|
|
|
12
|
-
gemspec :
|
|
12
|
+
gemspec path: "../"
|
data/gemfiles/rails_5_1.gemfile
CHANGED
|
@@ -2,12 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
source "https://rubygems.org"
|
|
4
4
|
|
|
5
|
-
gem "rails",
|
|
5
|
+
gem "rails", "~> 5.1.0"
|
|
6
6
|
gem "appraisal"
|
|
7
|
-
gem "activerecord-jdbcsqlite3-adapter", :
|
|
8
|
-
gem "sqlite3", :
|
|
9
|
-
gem "tzinfo-data", :
|
|
10
|
-
gem "
|
|
11
|
-
gem "rspec-rails", "~> 3.5"
|
|
7
|
+
gem "activerecord-jdbcsqlite3-adapter", platforms: :jruby
|
|
8
|
+
gem "sqlite3", platforms: [:ruby, :mswin, :mingw, :x64_mingw]
|
|
9
|
+
gem "tzinfo-data", platforms: [:mingw, :mswin, :x64_mingw]
|
|
10
|
+
gem "rspec-rails", "~> 3.7"
|
|
12
11
|
|
|
13
|
-
gemspec :
|
|
12
|
+
gemspec path: "../"
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# This file was generated by Appraisal
|
|
2
|
+
|
|
3
|
+
source "https://rubygems.org"
|
|
4
|
+
|
|
5
|
+
gem "rails", "5.2.0"
|
|
6
|
+
gem "appraisal"
|
|
7
|
+
gem "activerecord-jdbcsqlite3-adapter", platforms: :jruby
|
|
8
|
+
gem "sqlite3", platforms: [:ruby, :mswin, :mingw, :x64_mingw]
|
|
9
|
+
gem "tzinfo-data", platforms: [:mingw, :mswin, :x64_mingw]
|
|
10
|
+
gem "rspec-rails", "~> 3.7"
|
|
11
|
+
|
|
12
|
+
gemspec path: "../"
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# This file was generated by Appraisal
|
|
2
|
+
|
|
3
|
+
source "https://rubygems.org"
|
|
4
|
+
|
|
5
|
+
gem "rails", git: 'https://github.com/rails/rails'
|
|
6
|
+
gem "arel", git: 'https://github.com/rails/arel'
|
|
7
|
+
|
|
8
|
+
gem "appraisal"
|
|
9
|
+
gem "activerecord-jdbcsqlite3-adapter", platform: :jruby
|
|
10
|
+
gem "sqlite3", platform: [:ruby, :mswin, :mingw, :x64_mingw]
|
|
11
|
+
gem "tzinfo-data", platforms: [:mingw, :mswin, :x64_mingw]
|
|
12
|
+
|
|
13
|
+
%w[rspec-core rspec-expectations rspec-mocks rspec-rails rspec-support].each do |lib|
|
|
14
|
+
gem lib, git: "https://github.com/rspec/#{lib}.git", branch: 'master'
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
gemspec path: "../"
|
data/lib/doorkeeper/config.rb
CHANGED
|
@@ -15,19 +15,19 @@ module Doorkeeper
|
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
def self.configuration
|
|
18
|
-
@config || (
|
|
18
|
+
@config || (raise MissingConfiguration)
|
|
19
19
|
end
|
|
20
20
|
|
|
21
21
|
def self.setup_orm_adapter
|
|
22
22
|
@orm_adapter = "doorkeeper/orm/#{configuration.orm}".classify.constantize
|
|
23
|
-
rescue NameError =>
|
|
24
|
-
|
|
25
|
-
[doorkeeper] ORM adapter not found (#{configuration.orm}), or there was an error
|
|
26
|
-
trying to load it.
|
|
27
|
-
|
|
28
|
-
You probably need to add the related gem for this adapter to work with
|
|
29
|
-
doorkeeper.
|
|
30
|
-
|
|
23
|
+
rescue NameError => error
|
|
24
|
+
raise error, "ORM adapter not found (#{configuration.orm})", <<-ERROR_MSG.strip_heredoc
|
|
25
|
+
[doorkeeper] ORM adapter not found (#{configuration.orm}), or there was an error
|
|
26
|
+
trying to load it.
|
|
27
|
+
|
|
28
|
+
You probably need to add the related gem for this adapter to work with
|
|
29
|
+
doorkeeper.
|
|
30
|
+
ERROR_MSG
|
|
31
31
|
end
|
|
32
32
|
|
|
33
33
|
def self.setup_orm_models
|
|
@@ -59,12 +59,12 @@ doorkeeper.
|
|
|
59
59
|
# @option opts[Boolean] :confirmation (false)
|
|
60
60
|
# Set confirm_application_owner variable
|
|
61
61
|
def enable_application_owner(opts = {})
|
|
62
|
-
@config.instance_variable_set(
|
|
62
|
+
@config.instance_variable_set(:@enable_application_owner, true)
|
|
63
63
|
confirm_application_owner if opts[:confirmation].present? && opts[:confirmation]
|
|
64
64
|
end
|
|
65
65
|
|
|
66
66
|
def confirm_application_owner
|
|
67
|
-
@config.instance_variable_set(
|
|
67
|
+
@config.instance_variable_set(:@confirm_application_owner, true)
|
|
68
68
|
end
|
|
69
69
|
|
|
70
70
|
# Define default access token scopes for your provider
|
|
@@ -72,7 +72,7 @@ doorkeeper.
|
|
|
72
72
|
# @param scopes [Array] Default set of access (OAuth::Scopes.new)
|
|
73
73
|
# token scopes
|
|
74
74
|
def default_scopes(*scopes)
|
|
75
|
-
@config.instance_variable_set(
|
|
75
|
+
@config.instance_variable_set(:@default_scopes, OAuth::Scopes.from_array(scopes))
|
|
76
76
|
end
|
|
77
77
|
|
|
78
78
|
# Define default access token scopes for your provider
|
|
@@ -80,7 +80,7 @@ doorkeeper.
|
|
|
80
80
|
# @param scopes [Array] Optional set of access (OAuth::Scopes.new)
|
|
81
81
|
# token scopes
|
|
82
82
|
def optional_scopes(*scopes)
|
|
83
|
-
@config.instance_variable_set(
|
|
83
|
+
@config.instance_variable_set(:@optional_scopes, OAuth::Scopes.from_array(scopes))
|
|
84
84
|
end
|
|
85
85
|
|
|
86
86
|
# Change the way client credentials are retrieved from the request object.
|
|
@@ -90,7 +90,7 @@ doorkeeper.
|
|
|
90
90
|
#
|
|
91
91
|
# @param methods [Array] Define client credentials
|
|
92
92
|
def client_credentials(*methods)
|
|
93
|
-
@config.instance_variable_set(
|
|
93
|
+
@config.instance_variable_set(:@client_credentials_methods, methods)
|
|
94
94
|
end
|
|
95
95
|
|
|
96
96
|
# Change the way access token is authenticated from the request object.
|
|
@@ -100,57 +100,41 @@ doorkeeper.
|
|
|
100
100
|
#
|
|
101
101
|
# @param methods [Array] Define access token methods
|
|
102
102
|
def access_token_methods(*methods)
|
|
103
|
-
@config.instance_variable_set(
|
|
103
|
+
@config.instance_variable_set(:@access_token_methods, methods)
|
|
104
104
|
end
|
|
105
105
|
|
|
106
|
-
# Issue access tokens with refresh token (disabled
|
|
107
|
-
def use_refresh_token
|
|
108
|
-
@config.instance_variable_set(
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
#
|
|
113
|
-
# @param realm [String] ("Doorkeeper") Authentication realm
|
|
114
|
-
def realm(realm)
|
|
115
|
-
@config.instance_variable_set('@realm', realm)
|
|
106
|
+
# Issue access tokens with refresh token (disabled if not set)
|
|
107
|
+
def use_refresh_token(enabled = true, &block)
|
|
108
|
+
@config.instance_variable_set(
|
|
109
|
+
:@refresh_token_enabled,
|
|
110
|
+
block ? block : enabled
|
|
111
|
+
)
|
|
116
112
|
end
|
|
117
113
|
|
|
118
114
|
# Reuse access token for the same resource owner within an application
|
|
119
115
|
# (disabled by default)
|
|
120
116
|
# Rationale: https://github.com/doorkeeper-gem/doorkeeper/issues/383
|
|
121
117
|
def reuse_access_token
|
|
122
|
-
@config.instance_variable_set(
|
|
118
|
+
@config.instance_variable_set(:@reuse_access_token, true)
|
|
123
119
|
end
|
|
124
120
|
|
|
125
|
-
#
|
|
126
|
-
#
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
#
|
|
130
|
-
# @param [Boolean] boolean value for the parameter, true by default in
|
|
131
|
-
# non-development environment
|
|
132
|
-
def force_ssl_in_redirect_uri(boolean)
|
|
133
|
-
@config.instance_variable_set("@force_ssl_in_redirect_uri", boolean)
|
|
121
|
+
# Use an API mode for applications generated with --api argument
|
|
122
|
+
# It will skip applications controller, disable forgery protection
|
|
123
|
+
def api_only
|
|
124
|
+
@config.instance_variable_set(:@api_only, true)
|
|
134
125
|
end
|
|
135
126
|
|
|
136
|
-
#
|
|
137
|
-
#
|
|
138
|
-
#
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
def access_token_generator(access_token_generator)
|
|
142
|
-
@config.instance_variable_set(
|
|
143
|
-
'@access_token_generator', access_token_generator
|
|
144
|
-
)
|
|
127
|
+
# Forbids creating/updating applications with arbitrary scopes that are
|
|
128
|
+
# not in configuration, i.e. `default_scopes` or `optional_scopes`.
|
|
129
|
+
# (disabled by default)
|
|
130
|
+
def enforce_configured_scopes
|
|
131
|
+
@config.instance_variable_set(:@enforce_configured_scopes, true)
|
|
145
132
|
end
|
|
146
133
|
|
|
147
|
-
#
|
|
148
|
-
#
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
# @param base_controller [String] the name of the base controller
|
|
152
|
-
def base_controller(base_controller)
|
|
153
|
-
@config.instance_variable_set('@base_controller', base_controller)
|
|
134
|
+
# Enforce request content type as the spec requires:
|
|
135
|
+
# disabled by default for backward compatibility.
|
|
136
|
+
def enforce_content_type
|
|
137
|
+
@config.instance_variable_set(:@enforce_content_type, true)
|
|
154
138
|
end
|
|
155
139
|
end
|
|
156
140
|
|
|
@@ -210,10 +194,6 @@ doorkeeper.
|
|
|
210
194
|
|
|
211
195
|
public attribute
|
|
212
196
|
end
|
|
213
|
-
|
|
214
|
-
def extended(base)
|
|
215
|
-
base.send(:private, :option)
|
|
216
|
-
end
|
|
217
197
|
end
|
|
218
198
|
|
|
219
199
|
extend Option
|
|
@@ -221,48 +201,120 @@ doorkeeper.
|
|
|
221
201
|
option :resource_owner_authenticator,
|
|
222
202
|
as: :authenticate_resource_owner,
|
|
223
203
|
default: (lambda do |_routes|
|
|
224
|
-
logger.warn(
|
|
204
|
+
::Rails.logger.warn(
|
|
205
|
+
I18n.t('doorkeeper.errors.messages.resource_owner_authenticator_not_configured')
|
|
206
|
+
)
|
|
207
|
+
|
|
225
208
|
nil
|
|
226
209
|
end)
|
|
210
|
+
|
|
227
211
|
option :admin_authenticator,
|
|
228
212
|
as: :authenticate_admin,
|
|
229
|
-
default:
|
|
213
|
+
default: (lambda do |_routes|
|
|
214
|
+
::Rails.logger.warn(
|
|
215
|
+
I18n.t('doorkeeper.errors.messages.admin_authenticator_not_configured')
|
|
216
|
+
)
|
|
217
|
+
|
|
218
|
+
head :forbidden
|
|
219
|
+
end)
|
|
220
|
+
|
|
230
221
|
option :resource_owner_from_credentials,
|
|
231
222
|
default: (lambda do |_routes|
|
|
232
|
-
warn(
|
|
223
|
+
::Rails.logger.warn(
|
|
224
|
+
I18n.t('doorkeeper.errors.messages.credential_flow_not_configured')
|
|
225
|
+
)
|
|
226
|
+
|
|
233
227
|
nil
|
|
234
228
|
end)
|
|
235
|
-
|
|
229
|
+
option :before_successful_authorization, default: ->(_context) {}
|
|
230
|
+
option :after_successful_authorization, default: ->(_context) {}
|
|
231
|
+
option :before_successful_strategy_response, default: ->(_request) {}
|
|
232
|
+
option :after_successful_strategy_response,
|
|
233
|
+
default: ->(_request, _response) {}
|
|
236
234
|
option :skip_authorization, default: ->(_routes) {}
|
|
237
235
|
option :access_token_expires_in, default: 7200
|
|
238
|
-
option :custom_access_token_expires_in, default: ->(
|
|
236
|
+
option :custom_access_token_expires_in, default: ->(_context) { nil }
|
|
239
237
|
option :authorization_code_expires_in, default: 600
|
|
240
238
|
option :orm, default: :active_record
|
|
241
239
|
option :native_redirect_uri, default: 'urn:ietf:wg:oauth:2.0:oob'
|
|
242
240
|
option :active_record_options, default: {}
|
|
241
|
+
option :grant_flows, default: %w[authorization_code client_credentials]
|
|
242
|
+
|
|
243
|
+
# Allows to forbid specific Application redirect URI's by custom rules.
|
|
244
|
+
# Doesn't forbid any URI by default.
|
|
245
|
+
#
|
|
246
|
+
# @param forbid_redirect_uri [Proc] Block or any object respond to #call
|
|
247
|
+
#
|
|
248
|
+
option :forbid_redirect_uri, default: ->(_uri) { false }
|
|
249
|
+
|
|
250
|
+
# WWW-Authenticate Realm (default "Doorkeeper").
|
|
251
|
+
#
|
|
252
|
+
# @param realm [String] ("Doorkeeper") Authentication realm
|
|
253
|
+
#
|
|
243
254
|
option :realm, default: 'Doorkeeper'
|
|
255
|
+
|
|
256
|
+
# Forces the usage of the HTTPS protocol in non-native redirect uris
|
|
257
|
+
# (enabled by default in non-development environments). OAuth2
|
|
258
|
+
# delegates security in communication to the HTTPS protocol so it is
|
|
259
|
+
# wise to keep this enabled.
|
|
260
|
+
#
|
|
261
|
+
# @param [Boolean] boolean_or_block value for the parameter, true by default in
|
|
262
|
+
# non-development environment
|
|
263
|
+
#
|
|
264
|
+
# @yield [uri] Conditional usage of SSL redirect uris.
|
|
265
|
+
# @yieldparam [URI] Redirect URI
|
|
266
|
+
# @yieldreturn [Boolean] Indicates necessity of usage of the HTTPS protocol
|
|
267
|
+
# in non-native redirect uris
|
|
268
|
+
#
|
|
244
269
|
option :force_ssl_in_redirect_uri, default: !Rails.env.development?
|
|
245
|
-
|
|
270
|
+
|
|
271
|
+
# Use a custom class for generating the access token.
|
|
272
|
+
# https://github.com/doorkeeper-gem/doorkeeper#custom-access-token-generator
|
|
273
|
+
#
|
|
274
|
+
# @param access_token_generator [String]
|
|
275
|
+
# the name of the access token generator class
|
|
276
|
+
#
|
|
246
277
|
option :access_token_generator,
|
|
247
278
|
default: 'Doorkeeper::OAuth::Helpers::UniqueToken'
|
|
279
|
+
|
|
280
|
+
# The controller Doorkeeper::ApplicationController inherits from.
|
|
281
|
+
# Defaults to ActionController::Base.
|
|
282
|
+
# https://github.com/doorkeeper-gem/doorkeeper#custom-base-controller
|
|
283
|
+
#
|
|
284
|
+
# @param base_controller [String] the name of the base controller
|
|
248
285
|
option :base_controller,
|
|
249
286
|
default: 'ActionController::Base'
|
|
250
287
|
|
|
251
288
|
attr_reader :reuse_access_token
|
|
289
|
+
attr_reader :api_only
|
|
290
|
+
attr_reader :enforce_content_type
|
|
291
|
+
|
|
292
|
+
def api_only
|
|
293
|
+
@api_only ||= false
|
|
294
|
+
end
|
|
295
|
+
|
|
296
|
+
def enforce_content_type
|
|
297
|
+
@enforce_content_type ||= false
|
|
298
|
+
end
|
|
252
299
|
|
|
253
300
|
def refresh_token_enabled?
|
|
254
|
-
@refresh_token_enabled
|
|
255
|
-
|
|
301
|
+
if defined?(@refresh_token_enabled)
|
|
302
|
+
@refresh_token_enabled
|
|
303
|
+
else
|
|
304
|
+
false
|
|
305
|
+
end
|
|
306
|
+
end
|
|
307
|
+
|
|
308
|
+
def enforce_configured_scopes?
|
|
309
|
+
!!(defined?(@enforce_configured_scopes) && @enforce_configured_scopes)
|
|
256
310
|
end
|
|
257
311
|
|
|
258
312
|
def enable_application_owner?
|
|
259
|
-
@enable_application_owner
|
|
260
|
-
!!@enable_application_owner
|
|
313
|
+
!!(defined?(@enable_application_owner) && @enable_application_owner)
|
|
261
314
|
end
|
|
262
315
|
|
|
263
316
|
def confirm_application_owner?
|
|
264
|
-
@confirm_application_owner
|
|
265
|
-
!!@confirm_application_owner
|
|
317
|
+
!!(defined?(@confirm_application_owner) && @confirm_application_owner)
|
|
266
318
|
end
|
|
267
319
|
|
|
268
320
|
def default_scopes
|
|
@@ -278,19 +330,19 @@ doorkeeper.
|
|
|
278
330
|
end
|
|
279
331
|
|
|
280
332
|
def client_credentials_methods
|
|
281
|
-
@
|
|
333
|
+
@client_credentials_methods ||= %i[from_basic from_params]
|
|
282
334
|
end
|
|
283
335
|
|
|
284
336
|
def access_token_methods
|
|
285
|
-
@access_token_methods ||= [
|
|
337
|
+
@access_token_methods ||= %i[from_bearer_authorization from_access_token_param from_bearer_param]
|
|
286
338
|
end
|
|
287
339
|
|
|
288
340
|
def authorization_response_types
|
|
289
|
-
@authorization_response_types ||= calculate_authorization_response_types
|
|
341
|
+
@authorization_response_types ||= calculate_authorization_response_types.freeze
|
|
290
342
|
end
|
|
291
343
|
|
|
292
344
|
def token_grant_types
|
|
293
|
-
@token_grant_types ||= calculate_token_grant_types
|
|
345
|
+
@token_grant_types ||= calculate_token_grant_types.freeze
|
|
294
346
|
end
|
|
295
347
|
|
|
296
348
|
private
|
data/lib/doorkeeper/engine.rb
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
module Doorkeeper
|
|
2
2
|
class Engine < Rails::Engine
|
|
3
3
|
initializer "doorkeeper.params.filter" do |app|
|
|
4
|
-
parameters = %w
|
|
4
|
+
parameters = %w[client_secret code authentication_token access_token refresh_token]
|
|
5
5
|
app.config.filter_parameters << /^(#{Regexp.union parameters})$/
|
|
6
6
|
end
|
|
7
7
|
|
|
@@ -17,10 +17,14 @@ module Doorkeeper
|
|
|
17
17
|
|
|
18
18
|
if defined?(Sprockets) && Sprockets::VERSION.chr.to_i >= 4
|
|
19
19
|
initializer 'doorkeeper.assets.precompile' do |app|
|
|
20
|
-
|
|
20
|
+
# Force users to use:
|
|
21
|
+
# //= link doorkeeper/admin/application.css
|
|
22
|
+
# in Doorkeeper 5 for Sprockets 4 instead of precompile.
|
|
23
|
+
# Add note to official docs & Wiki
|
|
24
|
+
app.config.assets.precompile += %w[
|
|
21
25
|
doorkeeper/application.css
|
|
22
26
|
doorkeeper/admin/application.css
|
|
23
|
-
|
|
27
|
+
]
|
|
24
28
|
end
|
|
25
29
|
end
|
|
26
30
|
end
|
data/lib/doorkeeper/errors.rb
CHANGED
|
@@ -1,27 +1,42 @@
|
|
|
1
1
|
module Doorkeeper
|
|
2
2
|
module Errors
|
|
3
3
|
class DoorkeeperError < StandardError
|
|
4
|
+
def type
|
|
5
|
+
message
|
|
6
|
+
end
|
|
4
7
|
end
|
|
5
8
|
|
|
6
9
|
class InvalidAuthorizationStrategy < DoorkeeperError
|
|
10
|
+
def type
|
|
11
|
+
:unsupported_response_type
|
|
12
|
+
end
|
|
7
13
|
end
|
|
8
14
|
|
|
9
15
|
class InvalidTokenReuse < DoorkeeperError
|
|
16
|
+
def type
|
|
17
|
+
:invalid_request
|
|
18
|
+
end
|
|
10
19
|
end
|
|
11
20
|
|
|
12
21
|
class InvalidGrantReuse < DoorkeeperError
|
|
22
|
+
def type
|
|
23
|
+
:invalid_grant
|
|
24
|
+
end
|
|
13
25
|
end
|
|
14
26
|
|
|
15
27
|
class InvalidTokenStrategy < DoorkeeperError
|
|
28
|
+
def type
|
|
29
|
+
:unsupported_grant_type
|
|
30
|
+
end
|
|
16
31
|
end
|
|
17
32
|
|
|
18
33
|
class MissingRequestStrategy < DoorkeeperError
|
|
34
|
+
def type
|
|
35
|
+
:invalid_request
|
|
36
|
+
end
|
|
19
37
|
end
|
|
20
38
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
class TokenGeneratorNotFound < DoorkeeperError
|
|
25
|
-
end
|
|
39
|
+
UnableToGenerateToken = Class.new(DoorkeeperError)
|
|
40
|
+
TokenGeneratorNotFound = Class.new(DoorkeeperError)
|
|
26
41
|
end
|
|
27
42
|
end
|
|
@@ -9,7 +9,7 @@ module Doorkeeper
|
|
|
9
9
|
|
|
10
10
|
# endpoint specific scopes > parameter scopes > default scopes
|
|
11
11
|
def doorkeeper_authorize!(*scopes)
|
|
12
|
-
endpoint_scopes =
|
|
12
|
+
endpoint_scopes = endpoint.route_setting(:scopes) || endpoint.options[:route_options][:scopes]
|
|
13
13
|
scopes = if endpoint_scopes
|
|
14
14
|
Doorkeeper::OAuth::Scopes.from_array(endpoint_scopes)
|
|
15
15
|
elsif scopes && !scopes.empty?
|
|
@@ -20,20 +20,18 @@ module Doorkeeper
|
|
|
20
20
|
end
|
|
21
21
|
|
|
22
22
|
def doorkeeper_render_error_with(error)
|
|
23
|
-
status_code =
|
|
24
|
-
when :unauthorized
|
|
25
|
-
401
|
|
26
|
-
when :forbidden
|
|
27
|
-
403
|
|
28
|
-
end
|
|
29
|
-
|
|
23
|
+
status_code = error_status_codes[error.status]
|
|
30
24
|
error!({ error: error.description }, status_code, error.headers)
|
|
31
25
|
end
|
|
32
26
|
|
|
33
27
|
private
|
|
34
28
|
|
|
29
|
+
def endpoint
|
|
30
|
+
env['api.endpoint']
|
|
31
|
+
end
|
|
32
|
+
|
|
35
33
|
def doorkeeper_token
|
|
36
|
-
@
|
|
34
|
+
@doorkeeper_token ||= OAuth::Token.authenticate(
|
|
37
35
|
decorated_request,
|
|
38
36
|
*Doorkeeper.configuration.access_token_methods
|
|
39
37
|
)
|
|
@@ -42,6 +40,13 @@ module Doorkeeper
|
|
|
42
40
|
def decorated_request
|
|
43
41
|
AuthorizationDecorator.new(request)
|
|
44
42
|
end
|
|
43
|
+
|
|
44
|
+
def error_status_codes
|
|
45
|
+
{
|
|
46
|
+
unauthorized: 401,
|
|
47
|
+
forbidden: 403
|
|
48
|
+
}
|
|
49
|
+
end
|
|
45
50
|
end
|
|
46
51
|
end
|
|
47
52
|
end
|
|
@@ -5,11 +5,13 @@ module Doorkeeper
|
|
|
5
5
|
module Controller
|
|
6
6
|
private
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
# :doc:
|
|
9
|
+
def authenticate_resource_owner!
|
|
9
10
|
current_resource_owner
|
|
10
11
|
end
|
|
11
12
|
|
|
12
|
-
|
|
13
|
+
# :doc:
|
|
14
|
+
def current_resource_owner
|
|
13
15
|
instance_eval(&Doorkeeper.configuration.authenticate_resource_owner)
|
|
14
16
|
end
|
|
15
17
|
|
|
@@ -17,7 +19,8 @@ module Doorkeeper
|
|
|
17
19
|
instance_eval(&Doorkeeper.configuration.resource_owner_from_credentials)
|
|
18
20
|
end
|
|
19
21
|
|
|
20
|
-
|
|
22
|
+
# :doc:
|
|
23
|
+
def authenticate_admin!
|
|
21
24
|
instance_eval(&Doorkeeper.configuration.authenticate_admin)
|
|
22
25
|
end
|
|
23
26
|
|
|
@@ -25,31 +28,17 @@ module Doorkeeper
|
|
|
25
28
|
@server ||= Server.new(self)
|
|
26
29
|
end
|
|
27
30
|
|
|
28
|
-
|
|
29
|
-
|
|
31
|
+
# :doc:
|
|
32
|
+
def doorkeeper_token
|
|
33
|
+
@doorkeeper_token ||= OAuth::Token.authenticate request, *config_methods
|
|
30
34
|
end
|
|
31
35
|
|
|
32
36
|
def config_methods
|
|
33
|
-
@
|
|
37
|
+
@config_methods ||= Doorkeeper.configuration.access_token_methods
|
|
34
38
|
end
|
|
35
39
|
|
|
36
40
|
def get_error_response_from_exception(exception)
|
|
37
|
-
|
|
38
|
-
when Errors::InvalidTokenStrategy
|
|
39
|
-
:unsupported_grant_type
|
|
40
|
-
when Errors::InvalidAuthorizationStrategy
|
|
41
|
-
:unsupported_response_type
|
|
42
|
-
when Errors::MissingRequestStrategy
|
|
43
|
-
:invalid_request
|
|
44
|
-
when Errors::InvalidTokenReuse
|
|
45
|
-
:invalid_request
|
|
46
|
-
when Errors::InvalidGrantReuse
|
|
47
|
-
:invalid_grant
|
|
48
|
-
when Errors::DoorkeeperError
|
|
49
|
-
exception.message
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
OAuth::ErrorResponse.new name: error_name, state: params[:state]
|
|
41
|
+
OAuth::ErrorResponse.new name: exception.type, state: params[:state]
|
|
53
42
|
end
|
|
54
43
|
|
|
55
44
|
def handle_token_exception(exception)
|
|
@@ -62,6 +51,11 @@ module Doorkeeper
|
|
|
62
51
|
def skip_authorization?
|
|
63
52
|
!!instance_exec([@server.current_resource_owner, @pre_auth.client], &Doorkeeper.configuration.skip_authorization)
|
|
64
53
|
end
|
|
54
|
+
|
|
55
|
+
def enforce_content_type
|
|
56
|
+
return if request.content_type == 'application/x-www-form-urlencoded'
|
|
57
|
+
render json: {}, status: :unsupported_media_type
|
|
58
|
+
end
|
|
65
59
|
end
|
|
66
60
|
end
|
|
67
61
|
end
|