doorkeeper 5.3.0 → 5.4.0.rc1
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/Appraisals +0 -14
- data/CHANGELOG.md +44 -1
- data/Dangerfile +7 -7
- data/Dockerfile +2 -2
- data/Gemfile +9 -9
- data/README.md +6 -4
- data/app/controllers/doorkeeper/applications_controller.rb +4 -4
- data/app/controllers/doorkeeper/authorizations_controller.rb +31 -12
- data/app/controllers/doorkeeper/authorized_applications_controller.rb +2 -2
- data/app/controllers/doorkeeper/tokens_controller.rb +57 -20
- data/app/views/doorkeeper/applications/show.html.erb +19 -2
- data/bin/console +14 -0
- data/config/locales/en.yml +3 -1
- data/doorkeeper.gemspec +1 -1
- data/gemfiles/rails_5_0.gemfile +8 -7
- data/gemfiles/rails_5_1.gemfile +8 -7
- data/gemfiles/rails_5_2.gemfile +8 -7
- data/gemfiles/rails_6_0.gemfile +8 -7
- data/gemfiles/rails_master.gemfile +8 -7
- data/lib/doorkeeper/config/abstract_builder.rb +28 -0
- data/lib/doorkeeper/config/option.rb +28 -14
- data/lib/doorkeeper/config.rb +41 -17
- data/lib/doorkeeper/grape/helpers.rb +1 -1
- data/lib/doorkeeper/models/access_grant_mixin.rb +9 -11
- data/lib/doorkeeper/models/access_token_mixin.rb +102 -42
- data/lib/doorkeeper/models/concerns/resource_ownerable.rb +47 -0
- data/lib/doorkeeper/models/concerns/revocable.rb +1 -1
- data/lib/doorkeeper/models/concerns/scopes.rb +5 -1
- data/lib/doorkeeper/models/concerns/secret_storable.rb +1 -3
- data/lib/doorkeeper/oauth/authorization/code.rb +14 -5
- data/lib/doorkeeper/oauth/authorization/context.rb +2 -2
- data/lib/doorkeeper/oauth/authorization/token.rb +7 -11
- data/lib/doorkeeper/oauth/authorization/uri_builder.rb +4 -4
- data/lib/doorkeeper/oauth/authorization_code_request.rb +18 -8
- data/lib/doorkeeper/oauth/base_request.rb +11 -19
- data/lib/doorkeeper/oauth/client/credentials.rb +2 -4
- data/lib/doorkeeper/oauth/client.rb +1 -1
- data/lib/doorkeeper/oauth/client_credentials/creator.rb +25 -7
- data/lib/doorkeeper/oauth/client_credentials/issuer.rb +3 -2
- data/lib/doorkeeper/oauth/client_credentials/validator.rb +1 -1
- data/lib/doorkeeper/oauth/client_credentials_request.rb +8 -7
- data/lib/doorkeeper/oauth/code_request.rb +1 -1
- data/lib/doorkeeper/oauth/code_response.rb +6 -2
- data/lib/doorkeeper/oauth/error_response.rb +2 -4
- data/lib/doorkeeper/oauth/helpers/scope_checker.rb +1 -5
- data/lib/doorkeeper/oauth/hooks/context.rb +21 -0
- data/lib/doorkeeper/oauth/invalid_token_response.rb +2 -2
- data/lib/doorkeeper/oauth/password_access_token_request.rb +3 -5
- data/lib/doorkeeper/oauth/pre_authorization.rb +32 -27
- data/lib/doorkeeper/oauth/refresh_token_request.rb +18 -22
- data/lib/doorkeeper/oauth/token.rb +1 -1
- data/lib/doorkeeper/oauth/token_introspection.rb +3 -3
- data/lib/doorkeeper/oauth/token_request.rb +2 -2
- data/lib/doorkeeper/oauth/token_response.rb +1 -1
- data/lib/doorkeeper/orm/active_record/mixins/access_grant.rb +7 -2
- data/lib/doorkeeper/orm/active_record/mixins/access_token.rb +6 -2
- data/lib/doorkeeper/orm/active_record/mixins/application.rb +6 -2
- data/lib/doorkeeper/rails/routes/abstract_router.rb +35 -0
- data/lib/doorkeeper/rails/routes/mapper.rb +2 -2
- data/lib/doorkeeper/rails/routes/registry.rb +45 -0
- data/lib/doorkeeper/rails/routes.rb +13 -17
- data/lib/doorkeeper/request/strategy.rb +2 -2
- data/lib/doorkeeper/server.rb +3 -3
- data/lib/doorkeeper/version.rb +2 -2
- data/lib/doorkeeper.rb +106 -79
- data/lib/generators/doorkeeper/confidential_applications_generator.rb +1 -1
- data/lib/generators/doorkeeper/enable_polymorphic_resource_owner_generator.rb +39 -0
- data/lib/generators/doorkeeper/templates/add_owner_to_application_migration.rb.erb +2 -0
- data/lib/generators/doorkeeper/templates/add_previous_refresh_token_to_access_tokens.rb.erb +2 -0
- data/lib/generators/doorkeeper/templates/enable_pkce_migration.rb.erb +2 -0
- data/lib/generators/doorkeeper/templates/enable_polymorphic_resource_owner_migration.rb.erb +17 -0
- data/lib/generators/doorkeeper/templates/initializer.rb +47 -3
- data/lib/generators/doorkeeper/templates/migration.rb.erb +2 -0
- data/spec/controllers/applications_controller_spec.rb +2 -2
- data/spec/controllers/authorizations_controller_spec.rb +165 -30
- data/spec/controllers/tokens_controller_spec.rb +6 -5
- data/spec/dummy/app/helpers/application_helper.rb +1 -1
- data/spec/dummy/app/models/user.rb +5 -1
- data/spec/dummy/config/application.rb +6 -4
- data/spec/dummy/config/boot.rb +4 -4
- data/spec/dummy/config/environment.rb +1 -1
- data/spec/dummy/config/routes.rb +4 -4
- data/spec/dummy/db/migrate/20151223192035_create_doorkeeper_tables.rb +2 -2
- data/spec/dummy/db/schema.rb +3 -1
- data/spec/factories.rb +1 -1
- data/spec/generators/enable_polymorphic_resource_owner_generator_spec.rb +47 -0
- data/spec/lib/config_spec.rb +30 -11
- data/spec/lib/models/revocable_spec.rb +2 -3
- data/spec/lib/models/scopes_spec.rb +8 -0
- data/spec/lib/oauth/authorization_code_request_spec.rb +25 -15
- data/spec/lib/oauth/base_request_spec.rb +6 -20
- data/spec/lib/oauth/client_credentials/creator_spec.rb +90 -89
- data/spec/lib/oauth/client_credentials/issuer_spec.rb +84 -86
- data/spec/lib/oauth/client_credentials/validation_spec.rb +38 -40
- data/spec/lib/oauth/client_credentials_request_spec.rb +5 -4
- data/spec/lib/oauth/code_request_spec.rb +1 -1
- data/spec/lib/oauth/code_response_spec.rb +5 -1
- data/spec/lib/oauth/error_response_spec.rb +1 -1
- data/spec/lib/oauth/password_access_token_request_spec.rb +24 -13
- data/spec/lib/oauth/pre_authorization_spec.rb +13 -18
- data/spec/lib/oauth/refresh_token_request_spec.rb +19 -30
- data/spec/lib/oauth/token_request_spec.rb +14 -7
- data/spec/lib/option_spec.rb +51 -0
- data/spec/lib/stale_records_cleaner_spec.rb +18 -5
- data/spec/models/doorkeeper/access_grant_spec.rb +18 -4
- data/spec/models/doorkeeper/access_token_spec.rb +507 -479
- data/spec/models/doorkeeper/application_spec.rb +338 -300
- data/spec/requests/endpoints/token_spec.rb +5 -1
- data/spec/requests/flows/authorization_code_errors_spec.rb +4 -1
- data/spec/requests/flows/authorization_code_spec.rb +6 -1
- data/spec/requests/flows/client_credentials_spec.rb +41 -0
- data/spec/requests/flows/refresh_token_spec.rb +16 -8
- data/spec/requests/flows/revoke_token_spec.rb +143 -104
- data/spec/support/helpers/access_token_request_helper.rb +1 -0
- data/spec/support/helpers/authorization_request_helper.rb +4 -4
- data/spec/support/helpers/config_helper.rb +1 -1
- data/spec/support/shared/controllers_shared_context.rb +2 -2
- data/spec/support/shared/models_shared_examples.rb +6 -4
- metadata +15 -4
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
module Doorkeeper
|
|
4
4
|
module OAuth
|
|
5
5
|
class TokenRequest
|
|
6
|
-
|
|
6
|
+
attr_reader :pre_auth, :resource_owner
|
|
7
7
|
|
|
8
8
|
def initialize(pre_auth, resource_owner)
|
|
9
|
-
@pre_auth
|
|
9
|
+
@pre_auth = pre_auth
|
|
10
10
|
@resource_owner = resource_owner
|
|
11
11
|
end
|
|
12
12
|
|
|
@@ -13,8 +13,13 @@ module Doorkeeper::Orm::ActiveRecord::Mixins
|
|
|
13
13
|
optional: true,
|
|
14
14
|
inverse_of: :access_grants
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
if Doorkeeper.config.polymorphic_resource_owner?
|
|
17
|
+
belongs_to :resource_owner, polymorphic: true, optional: false
|
|
18
|
+
else
|
|
19
|
+
validates :resource_owner_id, presence: true
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
validates :application_id,
|
|
18
23
|
:token,
|
|
19
24
|
:expires_in,
|
|
20
25
|
:redirect_uri,
|
|
@@ -13,6 +13,10 @@ module Doorkeeper::Orm::ActiveRecord::Mixins
|
|
|
13
13
|
inverse_of: :access_tokens,
|
|
14
14
|
optional: true
|
|
15
15
|
|
|
16
|
+
if Doorkeeper.config.polymorphic_resource_owner?
|
|
17
|
+
belongs_to :resource_owner, polymorphic: true, optional: true
|
|
18
|
+
end
|
|
19
|
+
|
|
16
20
|
validates :token, presence: true, uniqueness: { case_sensitive: true }
|
|
17
21
|
validates :refresh_token, uniqueness: { case_sensitive: true }, if: :use_refresh_token?
|
|
18
22
|
|
|
@@ -25,7 +29,7 @@ module Doorkeeper::Orm::ActiveRecord::Mixins
|
|
|
25
29
|
on: :create, if: :use_refresh_token?
|
|
26
30
|
end
|
|
27
31
|
|
|
28
|
-
|
|
32
|
+
module ClassMethods
|
|
29
33
|
# Searches for not revoked Access Tokens associated with the
|
|
30
34
|
# specific Resource Owner.
|
|
31
35
|
#
|
|
@@ -36,7 +40,7 @@ module Doorkeeper::Orm::ActiveRecord::Mixins
|
|
|
36
40
|
# active Access Tokens for Resource Owner
|
|
37
41
|
#
|
|
38
42
|
def active_for(resource_owner)
|
|
39
|
-
|
|
43
|
+
by_resource_owner(resource_owner).where(revoked_at: nil)
|
|
40
44
|
end
|
|
41
45
|
|
|
42
46
|
def refresh_token_revoked_on_use?
|
|
@@ -72,6 +72,10 @@ module Doorkeeper::Orm::ActiveRecord::Mixins
|
|
|
72
72
|
hash
|
|
73
73
|
end
|
|
74
74
|
|
|
75
|
+
def authorized_for_resource_owner?(resource_owner)
|
|
76
|
+
Doorkeeper.configuration.authorize_resource_owner_for_client.call(self, resource_owner)
|
|
77
|
+
end
|
|
78
|
+
|
|
75
79
|
private
|
|
76
80
|
|
|
77
81
|
def generate_uid
|
|
@@ -79,7 +83,7 @@ module Doorkeeper::Orm::ActiveRecord::Mixins
|
|
|
79
83
|
end
|
|
80
84
|
|
|
81
85
|
def generate_secret
|
|
82
|
-
return
|
|
86
|
+
return if secret.present?
|
|
83
87
|
|
|
84
88
|
renew_secret
|
|
85
89
|
end
|
|
@@ -98,7 +102,7 @@ module Doorkeeper::Orm::ActiveRecord::Mixins
|
|
|
98
102
|
end
|
|
99
103
|
end
|
|
100
104
|
|
|
101
|
-
|
|
105
|
+
module ClassMethods
|
|
102
106
|
# Returns Applications associated with active (not revoked) Access Tokens
|
|
103
107
|
# that are owned by the specific Resource Owner.
|
|
104
108
|
#
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Doorkeeper
|
|
4
|
+
module Rails
|
|
5
|
+
# Abstract router module that implements base behavior
|
|
6
|
+
# for generating and mapping Rails routes.
|
|
7
|
+
#
|
|
8
|
+
# Could be reused in Doorkeeper extensions.
|
|
9
|
+
#
|
|
10
|
+
module AbstractRouter
|
|
11
|
+
extend ActiveSupport::Concern
|
|
12
|
+
|
|
13
|
+
attr_reader :routes
|
|
14
|
+
|
|
15
|
+
def initialize(routes, mapper = Mapper.new, &block)
|
|
16
|
+
@routes = routes
|
|
17
|
+
@mapping = mapper.map(&block)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def generate_routes!(**_options)
|
|
21
|
+
raise NotImplementedError, "must be redefined for #{self.class.name}!"
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
private
|
|
25
|
+
|
|
26
|
+
def map_route(name, method)
|
|
27
|
+
return if @mapping.skipped?(name)
|
|
28
|
+
|
|
29
|
+
send(method, @mapping[name])
|
|
30
|
+
|
|
31
|
+
mapping[name] = @mapping[name]
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Doorkeeper
|
|
4
|
+
module Rails
|
|
5
|
+
class Routes
|
|
6
|
+
# Thread-safe registry of any Doorkeeper additional routes.
|
|
7
|
+
# Used to allow implementing of Doorkeeper extensions that must
|
|
8
|
+
# use their own routes.
|
|
9
|
+
#
|
|
10
|
+
module Registry
|
|
11
|
+
ROUTES_ACCESS_LOCK = Mutex.new
|
|
12
|
+
ROUTES_DEFINITION_LOCK = Mutex.new
|
|
13
|
+
|
|
14
|
+
InvalidRouterClass = Class.new(StandardError)
|
|
15
|
+
|
|
16
|
+
# Collection of additional registered routes for Doorkeeper.
|
|
17
|
+
#
|
|
18
|
+
# @return [Array<Object>] set of registered routes
|
|
19
|
+
#
|
|
20
|
+
def registered_routes
|
|
21
|
+
ROUTES_DEFINITION_LOCK.synchronize do
|
|
22
|
+
@registered_routes ||= Set.new
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Registers additional routes in the Doorkeeper registry
|
|
27
|
+
#
|
|
28
|
+
# @param [Object] routes
|
|
29
|
+
# routes class
|
|
30
|
+
#
|
|
31
|
+
def register_routes(routes)
|
|
32
|
+
if !routes.is_a?(Module) || !(routes < AbstractRouter)
|
|
33
|
+
raise InvalidRouterClass, "routes class must include Doorkeeper::Rails::AbstractRouter"
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
ROUTES_ACCESS_LOCK.synchronize do
|
|
37
|
+
registered_routes << routes
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
alias register register_routes
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -2,29 +2,33 @@
|
|
|
2
2
|
|
|
3
3
|
require "doorkeeper/rails/routes/mapping"
|
|
4
4
|
require "doorkeeper/rails/routes/mapper"
|
|
5
|
+
require "doorkeeper/rails/routes/abstract_router"
|
|
6
|
+
require "doorkeeper/rails/routes/registry"
|
|
5
7
|
|
|
6
8
|
module Doorkeeper
|
|
7
9
|
module Rails
|
|
8
10
|
class Routes # :nodoc:
|
|
9
|
-
mattr_reader :mapping do
|
|
10
|
-
{}
|
|
11
|
-
end
|
|
12
|
-
|
|
13
11
|
module Helper
|
|
14
12
|
def use_doorkeeper(options = {}, &block)
|
|
15
13
|
Doorkeeper::Rails::Routes.new(self, &block).generate_routes!(options)
|
|
16
14
|
end
|
|
17
15
|
end
|
|
18
16
|
|
|
17
|
+
include AbstractRouter
|
|
18
|
+
extend Registry
|
|
19
|
+
|
|
20
|
+
mattr_reader :mapping do
|
|
21
|
+
{}
|
|
22
|
+
end
|
|
23
|
+
|
|
19
24
|
def self.install!
|
|
20
25
|
ActionDispatch::Routing::Mapper.include Doorkeeper::Rails::Routes::Helper
|
|
21
|
-
end
|
|
22
26
|
|
|
23
|
-
|
|
27
|
+
registered_routes.each(&:install!)
|
|
28
|
+
end
|
|
24
29
|
|
|
25
|
-
def initialize(routes, &block)
|
|
26
|
-
|
|
27
|
-
@mapping = Mapper.new.map(&block)
|
|
30
|
+
def initialize(routes, mapper = Mapper.new, &block)
|
|
31
|
+
super
|
|
28
32
|
|
|
29
33
|
@mapping.skips.push(:applications, :authorized_applications) if Doorkeeper.config.api_only
|
|
30
34
|
end
|
|
@@ -43,14 +47,6 @@ module Doorkeeper
|
|
|
43
47
|
|
|
44
48
|
private
|
|
45
49
|
|
|
46
|
-
def map_route(name, method)
|
|
47
|
-
return if @mapping.skipped?(name)
|
|
48
|
-
|
|
49
|
-
send(method, @mapping[name])
|
|
50
|
-
|
|
51
|
-
mapping[name] = @mapping[name]
|
|
52
|
-
end
|
|
53
|
-
|
|
54
50
|
def authorization_routes(mapping)
|
|
55
51
|
routes.resource(
|
|
56
52
|
:authorization,
|
data/lib/doorkeeper/server.rb
CHANGED
|
@@ -2,19 +2,19 @@
|
|
|
2
2
|
|
|
3
3
|
module Doorkeeper
|
|
4
4
|
class Server
|
|
5
|
-
|
|
5
|
+
attr_reader :context
|
|
6
6
|
|
|
7
7
|
def initialize(context = nil)
|
|
8
8
|
@context = context
|
|
9
9
|
end
|
|
10
10
|
|
|
11
11
|
def authorization_request(strategy)
|
|
12
|
-
klass = Request.authorization_strategy
|
|
12
|
+
klass = Request.authorization_strategy(strategy)
|
|
13
13
|
klass.new(self)
|
|
14
14
|
end
|
|
15
15
|
|
|
16
16
|
def token_request(strategy)
|
|
17
|
-
klass = Request.token_strategy
|
|
17
|
+
klass = Request.token_strategy(strategy)
|
|
18
18
|
klass.new(self)
|
|
19
19
|
end
|
|
20
20
|
|
data/lib/doorkeeper/version.rb
CHANGED
data/lib/doorkeeper.rb
CHANGED
|
@@ -1,89 +1,116 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require "doorkeeper/version"
|
|
4
|
-
require "doorkeeper/engine"
|
|
5
3
|
require "doorkeeper/config"
|
|
6
|
-
|
|
7
|
-
require "doorkeeper/request/strategy"
|
|
8
|
-
require "doorkeeper/request/authorization_code"
|
|
9
|
-
require "doorkeeper/request/client_credentials"
|
|
10
|
-
require "doorkeeper/request/code"
|
|
11
|
-
require "doorkeeper/request/password"
|
|
12
|
-
require "doorkeeper/request/refresh_token"
|
|
13
|
-
require "doorkeeper/request/token"
|
|
14
|
-
|
|
15
|
-
require "doorkeeper/errors"
|
|
16
|
-
require "doorkeeper/server"
|
|
17
|
-
require "doorkeeper/request"
|
|
18
|
-
require "doorkeeper/validations"
|
|
19
|
-
|
|
20
|
-
require "doorkeeper/oauth/authorization/code"
|
|
21
|
-
require "doorkeeper/oauth/authorization/context"
|
|
22
|
-
require "doorkeeper/oauth/authorization/token"
|
|
23
|
-
require "doorkeeper/oauth/authorization/uri_builder"
|
|
24
|
-
require "doorkeeper/oauth/helpers/scope_checker"
|
|
25
|
-
require "doorkeeper/oauth/helpers/uri_checker"
|
|
26
|
-
require "doorkeeper/oauth/helpers/unique_token"
|
|
27
|
-
|
|
28
|
-
require "doorkeeper/oauth"
|
|
29
|
-
require "doorkeeper/oauth/scopes"
|
|
30
|
-
require "doorkeeper/oauth/error"
|
|
31
|
-
require "doorkeeper/oauth/base_response"
|
|
32
|
-
require "doorkeeper/oauth/code_response"
|
|
33
|
-
require "doorkeeper/oauth/token_response"
|
|
34
|
-
require "doorkeeper/oauth/error_response"
|
|
35
|
-
require "doorkeeper/oauth/pre_authorization"
|
|
36
|
-
require "doorkeeper/oauth/base_request"
|
|
37
|
-
require "doorkeeper/oauth/authorization_code_request"
|
|
38
|
-
require "doorkeeper/oauth/refresh_token_request"
|
|
39
|
-
require "doorkeeper/oauth/password_access_token_request"
|
|
40
|
-
|
|
41
|
-
require "doorkeeper/oauth/client_credentials/validator"
|
|
42
|
-
require "doorkeeper/oauth/client_credentials/creator"
|
|
43
|
-
require "doorkeeper/oauth/client_credentials/issuer"
|
|
44
|
-
require "doorkeeper/oauth/client/credentials"
|
|
45
|
-
|
|
46
|
-
require "doorkeeper/oauth/client_credentials_request"
|
|
47
|
-
require "doorkeeper/oauth/code_request"
|
|
48
|
-
require "doorkeeper/oauth/token_request"
|
|
49
|
-
require "doorkeeper/oauth/client"
|
|
50
|
-
require "doorkeeper/oauth/token"
|
|
51
|
-
require "doorkeeper/oauth/token_introspection"
|
|
52
|
-
require "doorkeeper/oauth/invalid_token_response"
|
|
53
|
-
require "doorkeeper/oauth/forbidden_token_response"
|
|
54
|
-
require "doorkeeper/oauth/invalid_request_response"
|
|
55
|
-
require "doorkeeper/oauth/nonstandard"
|
|
56
|
-
|
|
57
|
-
require "doorkeeper/secret_storing/base"
|
|
58
|
-
require "doorkeeper/secret_storing/plain"
|
|
59
|
-
require "doorkeeper/secret_storing/sha256_hash"
|
|
60
|
-
require "doorkeeper/secret_storing/bcrypt"
|
|
61
|
-
|
|
62
|
-
require "doorkeeper/models/concerns/orderable"
|
|
63
|
-
require "doorkeeper/models/concerns/scopes"
|
|
64
|
-
require "doorkeeper/models/concerns/expirable"
|
|
65
|
-
require "doorkeeper/models/concerns/reusable"
|
|
66
|
-
require "doorkeeper/models/concerns/revocable"
|
|
67
|
-
require "doorkeeper/models/concerns/accessible"
|
|
68
|
-
require "doorkeeper/models/concerns/secret_storable"
|
|
69
|
-
|
|
70
|
-
require "doorkeeper/models/access_grant_mixin"
|
|
71
|
-
require "doorkeeper/models/access_token_mixin"
|
|
72
|
-
require "doorkeeper/models/application_mixin"
|
|
73
|
-
|
|
74
|
-
require "doorkeeper/helpers/controller"
|
|
75
|
-
|
|
76
|
-
require "doorkeeper/rails/routes"
|
|
77
|
-
require "doorkeeper/rails/helpers"
|
|
78
|
-
|
|
79
|
-
require "doorkeeper/rake"
|
|
80
|
-
require "doorkeeper/stale_records_cleaner"
|
|
81
|
-
|
|
82
|
-
require "doorkeeper/orm/active_record"
|
|
4
|
+
require "doorkeeper/engine"
|
|
83
5
|
|
|
84
6
|
# Main Doorkeeper namespace.
|
|
85
7
|
#
|
|
86
8
|
module Doorkeeper
|
|
9
|
+
autoload :OAuth, "doorkeeper/oauth"
|
|
10
|
+
autoload :Errors, "doorkeeper/errors"
|
|
11
|
+
autoload :Rake, "doorkeeper/rake"
|
|
12
|
+
autoload :Request, "doorkeeper/request"
|
|
13
|
+
autoload :Server, "doorkeeper/server"
|
|
14
|
+
autoload :StaleRecordsCleaner, "doorkeeper/stale_records_cleaner"
|
|
15
|
+
autoload :Validations, "doorkeeper/validations"
|
|
16
|
+
autoload :VERSION, "doorkeeper/version"
|
|
17
|
+
|
|
18
|
+
autoload :AccessGrantMixin, "doorkeeper/models/access_grant_mixin"
|
|
19
|
+
autoload :AccessTokenMixin, "doorkeeper/models/access_token_mixin"
|
|
20
|
+
autoload :ApplicationMixin, "doorkeeper/models/application_mixin"
|
|
21
|
+
|
|
22
|
+
module Helpers
|
|
23
|
+
autoload :Controller, "doorkeeper/helpers/controller"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
module Request
|
|
27
|
+
autoload :Strategy, "doorkeeper/request/strategy"
|
|
28
|
+
autoload :AuthorizationCode, "doorkeeper/request/authorization_code"
|
|
29
|
+
autoload :ClientCredentials, "doorkeeper/request/client_credentials"
|
|
30
|
+
autoload :Code, "doorkeeper/request/code"
|
|
31
|
+
autoload :Password, "doorkeeper/request/password"
|
|
32
|
+
autoload :RefreshToken, "doorkeeper/request/refresh_token"
|
|
33
|
+
autoload :Token, "doorkeeper/request/token"
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
module OAuth
|
|
37
|
+
autoload :BaseRequest, "doorkeeper/oauth/base_request"
|
|
38
|
+
autoload :AuthorizationCodeRequest, "doorkeeper/oauth/authorization_code_request"
|
|
39
|
+
autoload :BaseResponse, "doorkeeper/oauth/base_response"
|
|
40
|
+
autoload :CodeResponse, "doorkeeper/oauth/code_response"
|
|
41
|
+
autoload :Client, "doorkeeper/oauth/client"
|
|
42
|
+
autoload :ClientCredentialsRequest, "doorkeeper/oauth/client_credentials_request"
|
|
43
|
+
autoload :CodeRequest, "doorkeeper/oauth/code_request"
|
|
44
|
+
autoload :ErrorResponse, "doorkeeper/oauth/error_response"
|
|
45
|
+
autoload :Error, "doorkeeper/oauth/error"
|
|
46
|
+
autoload :InvalidTokenResponse, "doorkeeper/oauth/invalid_token_response"
|
|
47
|
+
autoload :InvalidRequestResponse, "doorkeeper/oauth/invalid_request_response"
|
|
48
|
+
autoload :ForbiddenTokenResponse, "doorkeeper/oauth/forbidden_token_response"
|
|
49
|
+
autoload :NonStandard, "doorkeeper/oauth/nonstandard"
|
|
50
|
+
autoload :PasswordAccessTokenRequest, "doorkeeper/oauth/password_access_token_request"
|
|
51
|
+
autoload :PreAuthorization, "doorkeeper/oauth/pre_authorization"
|
|
52
|
+
autoload :RefreshTokenRequest, "doorkeeper/oauth/refresh_token_request"
|
|
53
|
+
autoload :Scopes, "doorkeeper/oauth/scopes"
|
|
54
|
+
autoload :Token, "doorkeeper/oauth/token"
|
|
55
|
+
autoload :TokenIntrospection, "doorkeeper/oauth/token_introspection"
|
|
56
|
+
autoload :TokenRequest, "doorkeeper/oauth/token_request"
|
|
57
|
+
autoload :TokenResponse, "doorkeeper/oauth/token_response"
|
|
58
|
+
|
|
59
|
+
module Authorization
|
|
60
|
+
autoload :Code, "doorkeeper/oauth/authorization/code"
|
|
61
|
+
autoload :Context, "doorkeeper/oauth/authorization/context"
|
|
62
|
+
autoload :Token, "doorkeeper/oauth/authorization/token"
|
|
63
|
+
autoload :URIBuilder, "doorkeeper/oauth/authorization/uri_builder"
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
class Client
|
|
67
|
+
autoload :Credentials, "doorkeeper/oauth/client/credentials"
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
module ClientCredentials
|
|
71
|
+
autoload :Validator, "doorkeeper/oauth/client_credentials/validator"
|
|
72
|
+
autoload :Creator, "doorkeeper/oauth/client_credentials/creator"
|
|
73
|
+
autoload :Issuer, "doorkeeper/oauth/client_credentials/issuer"
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
module Helpers
|
|
77
|
+
autoload :ScopeChecker, "doorkeeper/oauth/helpers/scope_checker"
|
|
78
|
+
autoload :URIChecker, "doorkeeper/oauth/helpers/uri_checker"
|
|
79
|
+
autoload :UniqueToken, "doorkeeper/oauth/helpers/unique_token"
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
module Hooks
|
|
83
|
+
autoload :Context, "doorkeeper/oauth/hooks/context"
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
module Models
|
|
88
|
+
autoload :Accessible, "doorkeeper/models/concerns/accessible"
|
|
89
|
+
autoload :Expirable, "doorkeeper/models/concerns/expirable"
|
|
90
|
+
autoload :Orderable, "doorkeeper/models/concerns/orderable"
|
|
91
|
+
autoload :Scopes, "doorkeeper/models/concerns/scopes"
|
|
92
|
+
autoload :Reusable, "doorkeeper/models/concerns/reusable"
|
|
93
|
+
autoload :ResourceOwnerable, "doorkeeper/models/concerns/resource_ownerable"
|
|
94
|
+
autoload :Revocable, "doorkeeper/models/concerns/revocable"
|
|
95
|
+
autoload :SecretStorable, "doorkeeper/models/concerns/secret_storable"
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
module Orm
|
|
99
|
+
autoload :ActiveRecord, "doorkeeper/orm/active_record"
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
module Rails
|
|
103
|
+
autoload :Helpers, "doorkeeper/rails/helpers"
|
|
104
|
+
autoload :Routes, "doorkeeper/rails/routes"
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
module SecretStoring
|
|
108
|
+
autoload :Base, "doorkeeper/secret_storing/base"
|
|
109
|
+
autoload :Plain, "doorkeeper/secret_storing/plain"
|
|
110
|
+
autoload :Sha256Hash, "doorkeeper/secret_storing/sha256_hash"
|
|
111
|
+
autoload :BCrypt, "doorkeeper/secret_storing/bcrypt"
|
|
112
|
+
end
|
|
113
|
+
|
|
87
114
|
def self.authenticate(request, methods = Doorkeeper.config.access_token_methods)
|
|
88
115
|
OAuth::Token.authenticate(request, *methods)
|
|
89
116
|
end
|
|
@@ -12,7 +12,7 @@ module Doorkeeper
|
|
|
12
12
|
source_root File.expand_path("templates", __dir__)
|
|
13
13
|
desc "Add confidential column to Doorkeeper applications"
|
|
14
14
|
|
|
15
|
-
def
|
|
15
|
+
def confidential_applications
|
|
16
16
|
migration_template(
|
|
17
17
|
"add_confidential_to_applications.rb.erb",
|
|
18
18
|
"db/migrate/add_confidential_to_applications.rb",
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "rails/generators"
|
|
4
|
+
require "rails/generators/active_record"
|
|
5
|
+
|
|
6
|
+
module Doorkeeper
|
|
7
|
+
# Generates migration with polymorphic resource owner required
|
|
8
|
+
# database columns for Doorkeeper Access Token and Access Grant
|
|
9
|
+
# models.
|
|
10
|
+
#
|
|
11
|
+
class EnablePolymorphicResourceOwnerGenerator < ::Rails::Generators::Base
|
|
12
|
+
include ::Rails::Generators::Migration
|
|
13
|
+
source_root File.expand_path("templates", __dir__)
|
|
14
|
+
desc "Provide support for polymorphic Resource Owner."
|
|
15
|
+
|
|
16
|
+
def enable_polymorphic_resource_owner
|
|
17
|
+
migration_template(
|
|
18
|
+
"enable_polymorphic_resource_owner_migration.rb.erb",
|
|
19
|
+
"db/migrate/enable_polymorphic_resource_owner.rb",
|
|
20
|
+
migration_version: migration_version,
|
|
21
|
+
)
|
|
22
|
+
gsub_file(
|
|
23
|
+
"config/initializers/doorkeeper.rb",
|
|
24
|
+
"# use_polymorphic_resource_owner",
|
|
25
|
+
"use_polymorphic_resource_owner",
|
|
26
|
+
)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def self.next_migration_number(dirname)
|
|
30
|
+
ActiveRecord::Generators::Base.next_migration_number(dirname)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
private
|
|
34
|
+
|
|
35
|
+
def migration_version
|
|
36
|
+
"[#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}]"
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class EnablePolymorphicResourceOwner < ActiveRecord::Migration<%= migration_version %>
|
|
4
|
+
def change
|
|
5
|
+
add_column :oauth_access_tokens, :resource_owner_type, :string
|
|
6
|
+
add_column :oauth_access_grants, :resource_owner_type, :string
|
|
7
|
+
change_column_null :oauth_access_grants, :resource_owner_type, false
|
|
8
|
+
|
|
9
|
+
add_index :oauth_access_tokens,
|
|
10
|
+
[:resource_owner_id, :resource_owner_type],
|
|
11
|
+
name: 'polymorphic_owner_oauth_access_tokens'
|
|
12
|
+
|
|
13
|
+
add_index :oauth_access_grants,
|
|
14
|
+
[:resource_owner_id, :resource_owner_type],
|
|
15
|
+
name: 'polymorphic_owner_oauth_access_grants'
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -58,6 +58,23 @@ Doorkeeper.configure do
|
|
|
58
58
|
# end
|
|
59
59
|
# end
|
|
60
60
|
|
|
61
|
+
# Enables polymorphic Resource Owner association for Access Tokens and Access Grants.
|
|
62
|
+
# By default this option is disabled.
|
|
63
|
+
#
|
|
64
|
+
# Make sure you properly setup you database and have all the required columns (run
|
|
65
|
+
# `bundle exec rails generate doorkeeper:enable_polymorphic_resource_owner` and execute Rails
|
|
66
|
+
# migrations).
|
|
67
|
+
#
|
|
68
|
+
# If this option enabled, Doorkeeper will store not only Resource Owner primary key
|
|
69
|
+
# value, but also it's type (class name). See "Polymorphic Associations" section of
|
|
70
|
+
# Rails guides: https://guides.rubyonrails.org/association_basics.html#polymorphic-associations
|
|
71
|
+
#
|
|
72
|
+
# [NOTE] If you apply this option on already existing project don't forget to manually
|
|
73
|
+
# update `resource_owner_type` column in the database and fix migration template as it will
|
|
74
|
+
# set NOT NULL constraint for Access Grants table.
|
|
75
|
+
#
|
|
76
|
+
# use_polymorphic_resource_owner
|
|
77
|
+
|
|
61
78
|
# If you are planning to use Doorkeeper in Rails 5 API-only application, then you might
|
|
62
79
|
# want to use API mode that will skip all the views management and change the way how
|
|
63
80
|
# Doorkeeper responds to a requests.
|
|
@@ -117,6 +134,14 @@ Doorkeeper.configure do
|
|
|
117
134
|
#
|
|
118
135
|
# reuse_access_token
|
|
119
136
|
|
|
137
|
+
# In case you enabled `reuse_access_token` option Doorkeeper will try to find matching
|
|
138
|
+
# token using `matching_token_for` Access Token API that searches for valid records
|
|
139
|
+
# in batches in order not to pollute the memory with all the database records. By default
|
|
140
|
+
# Doorkeeper uses batch size of 10 000 records. You can increase or decrease this value
|
|
141
|
+
# depending on your needs and server capabilities.
|
|
142
|
+
#
|
|
143
|
+
# token_lookup_batch_size 10_000
|
|
144
|
+
|
|
120
145
|
# Set a limit for token_reuse if using reuse_access_token option
|
|
121
146
|
#
|
|
122
147
|
# This option limits token_reusability to some extent.
|
|
@@ -352,6 +377,17 @@ Doorkeeper.configure do
|
|
|
352
377
|
# client.grant_flows.include?(grant_flow)
|
|
353
378
|
# end
|
|
354
379
|
|
|
380
|
+
# If you need arbitrary Resource Owner-Client authorization you can enable this option
|
|
381
|
+
# and implement the check your need. Config option must respond to #call and return
|
|
382
|
+
# true in case resource owner authorized for the specific application or false in other
|
|
383
|
+
# cases.
|
|
384
|
+
#
|
|
385
|
+
# Be default all Resource Owners are authorized to any Client (application).
|
|
386
|
+
#
|
|
387
|
+
# authorize_resource_owner_for_client do |client, resource_owner|
|
|
388
|
+
# resource_owner.admin? || client.owners_whitelist.include?(resource_owner)
|
|
389
|
+
# end
|
|
390
|
+
|
|
355
391
|
# Hook into the strategies' request & response life-cycle in case your
|
|
356
392
|
# application needs advanced customization or logging:
|
|
357
393
|
#
|
|
@@ -364,17 +400,25 @@ Doorkeeper.configure do
|
|
|
364
400
|
# end
|
|
365
401
|
|
|
366
402
|
# Hook into Authorization flow in order to implement Single Sign Out
|
|
367
|
-
# or add any other functionality.
|
|
403
|
+
# or add any other functionality. Inside the block you have an access
|
|
404
|
+
# to `controller` (authorizations controller instance) and `context`
|
|
405
|
+
# (Doorkeeper::OAuth::Hooks::Context instance) which provides pre auth
|
|
406
|
+
# or auth objects with issued token based on hook type (before or after).
|
|
368
407
|
#
|
|
369
|
-
# before_successful_authorization do |controller|
|
|
408
|
+
# before_successful_authorization do |controller, context|
|
|
370
409
|
# Rails.logger.info(controller.request.params.inspect)
|
|
410
|
+
#
|
|
411
|
+
# Rails.logger.info(context.pre_auth.inspect)
|
|
371
412
|
# end
|
|
372
413
|
#
|
|
373
|
-
# after_successful_authorization do |controller|
|
|
414
|
+
# after_successful_authorization do |controller, context|
|
|
374
415
|
# controller.session[:logout_urls] <<
|
|
375
416
|
# Doorkeeper::Application
|
|
376
417
|
# .find_by(controller.request.params.slice(:redirect_uri))
|
|
377
418
|
# .logout_uri
|
|
419
|
+
#
|
|
420
|
+
# Rails.logger.info(context.auth.inspect)
|
|
421
|
+
# Rails.logger.info(context.issued_token)
|
|
378
422
|
# end
|
|
379
423
|
|
|
380
424
|
# Under some circumstances you might want to have applications auto-approved,
|