doorkeeper 5.0.0 → 5.1.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 +5 -5
- data/.hound.yml +2 -1
- data/.rubocop.yml +37 -4
- data/.travis.yml +16 -21
- data/Appraisals +29 -7
- data/Dangerfile +67 -0
- data/Gemfile +19 -5
- data/NEWS.md +107 -10
- data/README.md +75 -470
- data/Rakefile +10 -8
- data/app/controllers/doorkeeper/application_controller.rb +3 -2
- data/app/controllers/doorkeeper/application_metal_controller.rb +4 -13
- data/app/controllers/doorkeeper/applications_controller.rb +21 -7
- data/app/controllers/doorkeeper/authorizations_controller.rb +3 -3
- data/app/controllers/doorkeeper/authorized_applications_controller.rb +2 -0
- data/app/controllers/doorkeeper/token_info_controller.rb +4 -2
- data/app/controllers/doorkeeper/tokens_controller.rb +13 -11
- data/app/helpers/doorkeeper/dashboard_helper.rb +3 -1
- data/app/validators/redirect_uri_validator.rb +7 -2
- data/app/views/doorkeeper/applications/_form.html.erb +6 -0
- data/app/views/doorkeeper/applications/show.html.erb +1 -1
- data/app/views/layouts/doorkeeper/admin.html.erb +5 -3
- data/bin/console +16 -0
- data/config/locales/en.yml +1 -0
- data/doorkeeper.gemspec +28 -24
- data/gemfiles/rails_5_0.gemfile +9 -4
- data/gemfiles/rails_5_1.gemfile +9 -4
- data/gemfiles/rails_5_2.gemfile +10 -5
- data/gemfiles/rails_6_0.gemfile +17 -0
- data/gemfiles/rails_master.gemfile +9 -9
- data/lib/doorkeeper/config/option.rb +64 -0
- data/lib/doorkeeper/config.rb +197 -76
- data/lib/doorkeeper/engine.rb +3 -1
- data/lib/doorkeeper/errors.rb +17 -0
- data/lib/doorkeeper/grape/authorization_decorator.rb +6 -4
- data/lib/doorkeeper/grape/helpers.rb +5 -3
- data/lib/doorkeeper/helpers/controller.rb +5 -2
- data/lib/doorkeeper/models/access_grant_mixin.rb +25 -6
- data/lib/doorkeeper/models/access_token_mixin.rb +68 -22
- data/lib/doorkeeper/models/application_mixin.rb +45 -1
- data/lib/doorkeeper/models/concerns/accessible.rb +2 -0
- data/lib/doorkeeper/models/concerns/expirable.rb +6 -2
- data/lib/doorkeeper/models/concerns/orderable.rb +2 -0
- data/lib/doorkeeper/models/concerns/ownership.rb +3 -6
- data/lib/doorkeeper/models/concerns/reusable.rb +19 -0
- data/lib/doorkeeper/models/concerns/revocable.rb +4 -1
- data/lib/doorkeeper/models/concerns/scopes.rb +7 -1
- data/lib/doorkeeper/models/concerns/secret_storable.rb +108 -0
- data/lib/doorkeeper/oauth/authorization/code.rb +4 -2
- data/lib/doorkeeper/oauth/authorization/context.rb +2 -0
- data/lib/doorkeeper/oauth/authorization/token.rb +14 -7
- data/lib/doorkeeper/oauth/authorization/uri_builder.rb +3 -1
- data/lib/doorkeeper/oauth/authorization_code_request.rb +8 -4
- data/lib/doorkeeper/oauth/base_request.rb +2 -0
- data/lib/doorkeeper/oauth/base_response.rb +2 -0
- data/lib/doorkeeper/oauth/client/credentials.rb +2 -0
- data/lib/doorkeeper/oauth/client.rb +3 -1
- data/lib/doorkeeper/oauth/client_credentials/creator.rb +2 -0
- data/lib/doorkeeper/oauth/client_credentials/issuer.rb +2 -0
- data/lib/doorkeeper/oauth/client_credentials/validation.rb +7 -4
- data/lib/doorkeeper/oauth/client_credentials_request.rb +3 -1
- data/lib/doorkeeper/oauth/code_request.rb +2 -0
- data/lib/doorkeeper/oauth/code_response.rb +4 -2
- data/lib/doorkeeper/oauth/error.rb +2 -0
- data/lib/doorkeeper/oauth/error_response.rb +20 -6
- data/lib/doorkeeper/oauth/forbidden_token_response.rb +10 -3
- data/lib/doorkeeper/oauth/helpers/scope_checker.rb +25 -8
- data/lib/doorkeeper/oauth/helpers/unique_token.rb +15 -1
- data/lib/doorkeeper/oauth/helpers/uri_checker.rb +42 -3
- data/lib/doorkeeper/oauth/invalid_token_response.rb +22 -0
- data/lib/doorkeeper/oauth/password_access_token_request.rb +9 -2
- data/lib/doorkeeper/oauth/pre_authorization.rb +13 -5
- data/lib/doorkeeper/oauth/refresh_token_request.rb +15 -4
- data/lib/doorkeeper/oauth/scopes.rb +7 -3
- data/lib/doorkeeper/oauth/token.rb +4 -2
- data/lib/doorkeeper/oauth/token_introspection.rb +76 -8
- data/lib/doorkeeper/oauth/token_request.rb +2 -0
- data/lib/doorkeeper/oauth/token_response.rb +11 -9
- data/lib/doorkeeper/oauth.rb +5 -5
- data/lib/doorkeeper/orm/active_record/access_grant.rb +27 -13
- data/lib/doorkeeper/orm/active_record/access_token.rb +6 -13
- data/lib/doorkeeper/orm/active_record/application.rb +26 -7
- data/lib/doorkeeper/orm/active_record/stale_records_cleaner.rb +10 -3
- data/lib/doorkeeper/orm/active_record.rb +8 -6
- data/lib/doorkeeper/rails/helpers.rb +5 -1
- data/lib/doorkeeper/rails/routes/mapper.rb +2 -0
- data/lib/doorkeeper/rails/routes/mapping.rb +9 -7
- data/lib/doorkeeper/rails/routes.rb +19 -12
- data/lib/doorkeeper/rake/db.rake +17 -17
- data/lib/doorkeeper/rake.rb +1 -1
- data/lib/doorkeeper/request/authorization_code.rb +2 -0
- data/lib/doorkeeper/request/client_credentials.rb +2 -0
- data/lib/doorkeeper/request/code.rb +2 -0
- data/lib/doorkeeper/request/password.rb +2 -0
- data/lib/doorkeeper/request/refresh_token.rb +2 -0
- data/lib/doorkeeper/request/strategy.rb +2 -0
- data/lib/doorkeeper/request/token.rb +2 -0
- data/lib/doorkeeper/request.rb +3 -1
- data/lib/doorkeeper/secret_storing/base.rb +64 -0
- data/lib/doorkeeper/secret_storing/bcrypt.rb +60 -0
- data/lib/doorkeeper/secret_storing/plain.rb +33 -0
- data/lib/doorkeeper/secret_storing/sha256_hash.rb +26 -0
- data/lib/doorkeeper/server.rb +2 -0
- data/lib/doorkeeper/stale_records_cleaner.rb +20 -0
- data/lib/doorkeeper/validations.rb +2 -0
- data/lib/doorkeeper/version.rb +4 -2
- data/lib/doorkeeper.rb +69 -59
- data/lib/generators/doorkeeper/application_owner_generator.rb +10 -9
- data/lib/generators/doorkeeper/confidential_applications_generator.rb +10 -9
- data/lib/generators/doorkeeper/install_generator.rb +11 -9
- data/lib/generators/doorkeeper/migration_generator.rb +9 -9
- data/lib/generators/doorkeeper/pkce_generator.rb +10 -9
- data/lib/generators/doorkeeper/previous_refresh_token_generator.rb +10 -9
- data/lib/generators/doorkeeper/templates/initializer.rb +138 -13
- data/lib/generators/doorkeeper/templates/migration.rb.erb +17 -10
- data/lib/generators/doorkeeper/views_generator.rb +6 -4
- data/spec/controllers/application_metal_controller_spec.rb +24 -10
- data/spec/controllers/applications_controller_spec.rb +76 -78
- data/spec/controllers/authorizations_controller_spec.rb +189 -142
- data/spec/controllers/protected_resources_controller_spec.rb +111 -67
- data/spec/controllers/token_info_controller_spec.rb +14 -12
- data/spec/controllers/tokens_controller_spec.rb +170 -112
- data/spec/dummy/Rakefile +3 -1
- data/spec/dummy/app/controllers/application_controller.rb +3 -1
- data/spec/dummy/app/controllers/custom_authorizations_controller.rb +3 -1
- data/spec/dummy/app/controllers/full_protected_resources_controller.rb +4 -2
- data/spec/dummy/app/controllers/home_controller.rb +6 -5
- data/spec/dummy/app/controllers/metal_controller.rb +2 -0
- data/spec/dummy/app/controllers/semi_protected_resources_controller.rb +4 -2
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/models/user.rb +2 -0
- data/spec/dummy/config/application.rb +26 -2
- data/spec/dummy/config/boot.rb +2 -4
- data/spec/dummy/config/environment.rb +1 -1
- data/spec/dummy/config/environments/development.rb +2 -0
- data/spec/dummy/config/environments/production.rb +2 -0
- data/spec/dummy/config/environments/test.rb +4 -2
- data/spec/dummy/config/initializers/backtrace_silencers.rb +2 -0
- data/spec/dummy/config/initializers/doorkeeper.rb +7 -3
- data/spec/dummy/config/initializers/secret_token.rb +3 -1
- data/spec/dummy/config/initializers/session_store.rb +3 -1
- data/spec/dummy/config/initializers/wrap_parameters.rb +2 -0
- data/spec/dummy/config.ru +3 -1
- data/spec/dummy/db/migrate/20151223192035_create_doorkeeper_tables.rb +20 -13
- data/spec/dummy/db/migrate/20151223200000_add_owner_to_application.rb +1 -1
- data/spec/dummy/db/migrate/20170822064514_enable_pkce.rb +2 -0
- data/spec/dummy/db/schema.rb +1 -1
- data/spec/dummy/script/rails +7 -4
- data/spec/factories.rb +11 -9
- data/spec/generators/application_owner_generator_spec.rb +13 -26
- data/spec/generators/confidential_applications_generator_spec.rb +12 -28
- data/spec/generators/install_generator_spec.rb +19 -14
- data/spec/generators/migration_generator_spec.rb +13 -26
- data/spec/generators/pkce_generator_spec.rb +11 -26
- data/spec/generators/previous_refresh_token_generator_spec.rb +16 -29
- data/spec/generators/templates/routes.rb +2 -1
- data/spec/generators/views_generator_spec.rb +14 -12
- data/spec/grape/grape_integration_spec.rb +35 -33
- data/spec/helpers/doorkeeper/dashboard_helper_spec.rb +9 -7
- data/spec/lib/config_spec.rb +290 -104
- data/spec/lib/doorkeeper_spec.rb +8 -6
- data/spec/lib/models/expirable_spec.rb +22 -8
- data/spec/lib/models/reusable_spec.rb +40 -0
- data/spec/lib/models/revocable_spec.rb +8 -6
- data/spec/lib/models/scopes_spec.rb +27 -13
- data/spec/lib/models/secret_storable_spec.rb +135 -0
- data/spec/lib/oauth/authorization/uri_builder_spec.rb +17 -15
- data/spec/lib/oauth/authorization_code_request_spec.rb +43 -17
- data/spec/lib/oauth/base_request_spec.rb +24 -12
- data/spec/lib/oauth/base_response_spec.rb +3 -1
- data/spec/lib/oauth/client/credentials_spec.rb +26 -24
- data/spec/lib/oauth/client_credentials/creator_spec.rb +56 -10
- data/spec/lib/oauth/client_credentials/issuer_spec.rb +27 -20
- data/spec/lib/oauth/client_credentials/validation_spec.rb +21 -15
- data/spec/lib/oauth/client_credentials_integration_spec.rb +8 -6
- data/spec/lib/oauth/client_credentials_request_spec.rb +27 -21
- data/spec/lib/oauth/client_spec.rb +15 -13
- data/spec/lib/oauth/code_request_spec.rb +10 -8
- data/spec/lib/oauth/code_response_spec.rb +9 -7
- data/spec/lib/oauth/error_response_spec.rb +19 -11
- data/spec/lib/oauth/error_spec.rb +4 -2
- data/spec/lib/oauth/forbidden_token_response_spec.rb +7 -5
- data/spec/lib/oauth/helpers/scope_checker_spec.rb +68 -31
- data/spec/lib/oauth/helpers/unique_token_spec.rb +8 -6
- data/spec/lib/oauth/helpers/uri_checker_spec.rb +124 -93
- data/spec/lib/oauth/invalid_token_response_spec.rb +3 -1
- data/spec/lib/oauth/password_access_token_request_spec.rb +95 -34
- data/spec/lib/oauth/pre_authorization_spec.rb +80 -54
- data/spec/lib/oauth/refresh_token_request_spec.rb +46 -39
- data/spec/lib/oauth/scopes_spec.rb +63 -61
- data/spec/lib/oauth/token_request_spec.rb +80 -25
- data/spec/lib/oauth/token_response_spec.rb +40 -38
- data/spec/lib/oauth/token_spec.rb +64 -45
- data/spec/lib/request/strategy_spec.rb +3 -1
- data/spec/lib/secret_storing/base_spec.rb +60 -0
- data/spec/lib/secret_storing/bcrypt_spec.rb +49 -0
- data/spec/lib/secret_storing/plain_spec.rb +44 -0
- data/spec/lib/secret_storing/sha256_hash_spec.rb +48 -0
- data/spec/lib/server_spec.rb +20 -18
- data/spec/lib/{orm/active_record/stale_records_cleaner_spec.rb → stale_records_cleaner_spec.rb} +28 -18
- data/spec/models/doorkeeper/access_grant_spec.rb +80 -15
- data/spec/models/doorkeeper/access_token_spec.rb +212 -83
- data/spec/models/doorkeeper/application_spec.rb +146 -49
- data/spec/requests/applications/applications_request_spec.rb +100 -68
- data/spec/requests/applications/authorized_applications_spec.rb +20 -18
- data/spec/requests/endpoints/authorization_spec.rb +27 -25
- data/spec/requests/endpoints/token_spec.rb +38 -36
- data/spec/requests/flows/authorization_code_errors_spec.rb +27 -25
- data/spec/requests/flows/authorization_code_spec.rb +260 -158
- data/spec/requests/flows/client_credentials_spec.rb +54 -52
- data/spec/requests/flows/implicit_grant_errors_spec.rb +11 -9
- data/spec/requests/flows/implicit_grant_spec.rb +27 -25
- data/spec/requests/flows/password_spec.rb +64 -56
- data/spec/requests/flows/refresh_token_spec.rb +91 -32
- data/spec/requests/flows/revoke_token_spec.rb +49 -63
- data/spec/requests/flows/skip_authorization_spec.rb +23 -21
- data/spec/requests/protected_resources/metal_spec.rb +7 -5
- data/spec/requests/protected_resources/private_api_spec.rb +37 -35
- data/spec/routing/custom_controller_routes_spec.rb +71 -65
- data/spec/routing/default_routes_spec.rb +22 -20
- data/spec/routing/scoped_routes_spec.rb +20 -18
- data/spec/spec_helper.rb +15 -13
- data/spec/spec_helper_integration.rb +3 -1
- data/spec/support/dependencies/factory_bot.rb +3 -1
- data/spec/support/doorkeeper_rspec.rb +5 -2
- data/spec/support/helpers/access_token_request_helper.rb +3 -1
- data/spec/support/helpers/authorization_request_helper.rb +4 -2
- data/spec/support/helpers/config_helper.rb +2 -0
- data/spec/support/helpers/model_helper.rb +11 -5
- data/spec/support/helpers/request_spec_helper.rb +5 -3
- data/spec/support/helpers/url_helper.rb +20 -18
- data/spec/support/http_method_shim.rb +4 -9
- data/spec/support/orm/active_record.rb +3 -1
- data/spec/support/shared/controllers_shared_context.rb +68 -10
- data/spec/support/shared/hashing_shared_context.rb +36 -0
- data/spec/support/shared/models_shared_examples.rb +12 -10
- data/spec/validators/redirect_uri_validator_spec.rb +76 -47
- data/spec/version/version_spec.rb +7 -5
- metadata +70 -21
- data/gemfiles/rails_4_2.gemfile +0 -13
- data/spec/dummy/config/initializers/new_framework_defaults.rb +0 -10
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "spec_helper"
|
|
2
4
|
|
|
3
5
|
module ControllerActions
|
|
4
6
|
def index
|
|
5
|
-
render plain:
|
|
7
|
+
render plain: "index"
|
|
6
8
|
end
|
|
7
9
|
|
|
8
10
|
def show
|
|
9
|
-
render plain:
|
|
11
|
+
render plain: "show"
|
|
10
12
|
end
|
|
11
13
|
|
|
12
14
|
def doorkeeper_unauthorized_render_options(*); end
|
|
@@ -14,98 +16,98 @@ module ControllerActions
|
|
|
14
16
|
def doorkeeper_forbidden_render_options(*); end
|
|
15
17
|
end
|
|
16
18
|
|
|
17
|
-
describe
|
|
18
|
-
context
|
|
19
|
+
describe "doorkeeper authorize filter" do
|
|
20
|
+
context "accepts token code specified as" do
|
|
19
21
|
controller do
|
|
20
22
|
before_action :doorkeeper_authorize!
|
|
21
23
|
|
|
22
24
|
def index
|
|
23
|
-
render plain:
|
|
25
|
+
render plain: "index"
|
|
24
26
|
end
|
|
25
27
|
end
|
|
26
28
|
|
|
27
|
-
let(:token_string) {
|
|
29
|
+
let(:token_string) { "1A2BC3" }
|
|
28
30
|
let(:token) do
|
|
29
31
|
double(Doorkeeper::AccessToken,
|
|
30
32
|
acceptable?: true, previous_refresh_token: "",
|
|
31
33
|
revoke_previous_refresh_token!: true)
|
|
32
34
|
end
|
|
33
35
|
|
|
34
|
-
it
|
|
36
|
+
it "access_token param" do
|
|
35
37
|
expect(Doorkeeper::AccessToken).to receive(:by_token).with(token_string).and_return(token)
|
|
36
38
|
get :index, params: { access_token: token_string }
|
|
37
39
|
end
|
|
38
40
|
|
|
39
|
-
it
|
|
41
|
+
it "bearer_token param" do
|
|
40
42
|
expect(Doorkeeper::AccessToken).to receive(:by_token).with(token_string).and_return(token)
|
|
41
43
|
get :index, params: { bearer_token: token_string }
|
|
42
44
|
end
|
|
43
45
|
|
|
44
|
-
it
|
|
46
|
+
it "Authorization header" do
|
|
45
47
|
expect(Doorkeeper::AccessToken).to receive(:by_token).with(token_string).and_return(token)
|
|
46
|
-
request.env[
|
|
48
|
+
request.env["HTTP_AUTHORIZATION"] = "Bearer #{token_string}"
|
|
47
49
|
get :index
|
|
48
50
|
end
|
|
49
51
|
|
|
50
|
-
it
|
|
52
|
+
it "different kind of Authorization header" do
|
|
51
53
|
expect(Doorkeeper::AccessToken).not_to receive(:by_token)
|
|
52
|
-
request.env[
|
|
54
|
+
request.env["HTTP_AUTHORIZATION"] = "MAC #{token_string}"
|
|
53
55
|
get :index
|
|
54
56
|
end
|
|
55
57
|
|
|
56
|
-
it
|
|
58
|
+
it "does not change Authorization header value" do
|
|
57
59
|
expect(Doorkeeper::AccessToken).to receive(:by_token).exactly(2).times.and_return(token)
|
|
58
|
-
request.env[
|
|
60
|
+
request.env["HTTP_AUTHORIZATION"] = "Bearer #{token_string}"
|
|
59
61
|
get :index
|
|
60
62
|
controller.send(:remove_instance_variable, :@doorkeeper_token)
|
|
61
63
|
get :index
|
|
62
64
|
end
|
|
63
65
|
end
|
|
64
66
|
|
|
65
|
-
context
|
|
67
|
+
context "defined for all actions" do
|
|
66
68
|
controller do
|
|
67
69
|
before_action :doorkeeper_authorize!
|
|
68
70
|
|
|
69
71
|
include ControllerActions
|
|
70
72
|
end
|
|
71
73
|
|
|
72
|
-
context
|
|
73
|
-
it
|
|
74
|
+
context "with valid token", token: :valid do
|
|
75
|
+
it "allows into index action" do
|
|
74
76
|
get :index, params: { access_token: token_string }
|
|
75
77
|
expect(response).to be_successful
|
|
76
78
|
end
|
|
77
79
|
|
|
78
|
-
it
|
|
79
|
-
get :show, params: { id:
|
|
80
|
+
it "allows into show action" do
|
|
81
|
+
get :show, params: { id: "4", access_token: token_string }
|
|
80
82
|
expect(response).to be_successful
|
|
81
83
|
end
|
|
82
84
|
end
|
|
83
85
|
|
|
84
|
-
context
|
|
85
|
-
it
|
|
86
|
+
context "with invalid token", token: :invalid do
|
|
87
|
+
it "does not allow into index action" do
|
|
86
88
|
get :index, params: { access_token: token_string }
|
|
87
89
|
expect(response.status).to eq 401
|
|
88
|
-
expect(response.header[
|
|
90
|
+
expect(response.header["WWW-Authenticate"]).to match(/^Bearer/)
|
|
89
91
|
end
|
|
90
92
|
|
|
91
|
-
it
|
|
92
|
-
get :show, params: { id:
|
|
93
|
+
it "does not allow into show action" do
|
|
94
|
+
get :show, params: { id: "4", access_token: token_string }
|
|
93
95
|
expect(response.status).to eq 401
|
|
94
|
-
expect(response.header[
|
|
96
|
+
expect(response.header["WWW-Authenticate"]).to match(/^Bearer/)
|
|
95
97
|
end
|
|
96
98
|
end
|
|
97
99
|
end
|
|
98
100
|
|
|
99
|
-
context
|
|
101
|
+
context "defined with scopes" do
|
|
100
102
|
controller do
|
|
101
103
|
before_action -> { doorkeeper_authorize! :write }
|
|
102
104
|
|
|
103
105
|
include ControllerActions
|
|
104
106
|
end
|
|
105
107
|
|
|
106
|
-
let(:token_string) {
|
|
108
|
+
let(:token_string) { "1A2DUWE" }
|
|
107
109
|
|
|
108
|
-
it
|
|
110
|
+
it "allows if the token has particular scopes" do
|
|
109
111
|
token = double(Doorkeeper::AccessToken,
|
|
110
112
|
accessible?: true, scopes: %w[write public],
|
|
111
113
|
previous_refresh_token: "",
|
|
@@ -119,9 +121,9 @@ describe 'doorkeeper authorize filter' do
|
|
|
119
121
|
expect(response).to be_successful
|
|
120
122
|
end
|
|
121
123
|
|
|
122
|
-
it
|
|
124
|
+
it "does not allow if the token does not include given scope" do
|
|
123
125
|
token = double(Doorkeeper::AccessToken,
|
|
124
|
-
accessible?: true, scopes: [
|
|
126
|
+
accessible?: true, scopes: ["public"], revoked?: false,
|
|
125
127
|
expired?: false, previous_refresh_token: "",
|
|
126
128
|
revoke_previous_refresh_token!: true)
|
|
127
129
|
expect(
|
|
@@ -131,18 +133,18 @@ describe 'doorkeeper authorize filter' do
|
|
|
131
133
|
|
|
132
134
|
get :index, params: { access_token: token_string }
|
|
133
135
|
expect(response.status).to eq 403
|
|
134
|
-
expect(response.header).to_not include(
|
|
136
|
+
expect(response.header).to_not include("WWW-Authenticate")
|
|
135
137
|
end
|
|
136
138
|
end
|
|
137
139
|
|
|
138
|
-
context
|
|
140
|
+
context "when custom unauthorized render options are configured" do
|
|
139
141
|
controller do
|
|
140
142
|
before_action :doorkeeper_authorize!
|
|
141
143
|
|
|
142
144
|
include ControllerActions
|
|
143
145
|
end
|
|
144
146
|
|
|
145
|
-
context
|
|
147
|
+
context "with a JSON custom render", token: :invalid do
|
|
146
148
|
before do
|
|
147
149
|
module ControllerActions
|
|
148
150
|
remove_method :doorkeeper_unauthorized_render_options
|
|
@@ -157,29 +159,28 @@ describe 'doorkeeper authorize filter' do
|
|
|
157
159
|
module ControllerActions
|
|
158
160
|
remove_method :doorkeeper_unauthorized_render_options
|
|
159
161
|
|
|
160
|
-
def doorkeeper_unauthorized_render_options(error: nil)
|
|
161
|
-
end
|
|
162
|
+
def doorkeeper_unauthorized_render_options(error: nil); end
|
|
162
163
|
end
|
|
163
164
|
end
|
|
164
165
|
|
|
165
|
-
it
|
|
166
|
+
it "it renders a custom JSON response", token: :invalid do
|
|
166
167
|
get :index, params: { access_token: token_string }
|
|
167
168
|
expect(response.status).to eq 401
|
|
168
|
-
expect(response.content_type).to eq(
|
|
169
|
-
expect(response.header[
|
|
169
|
+
expect(response.content_type).to eq("application/json")
|
|
170
|
+
expect(response.header["WWW-Authenticate"]).to match(/^Bearer/)
|
|
170
171
|
|
|
171
172
|
expect(json_response).not_to be_nil
|
|
172
|
-
expect(json_response[
|
|
173
|
+
expect(json_response["error_message"]).to match("token is invalid")
|
|
173
174
|
end
|
|
174
175
|
end
|
|
175
176
|
|
|
176
|
-
context
|
|
177
|
+
context "with a text custom render", token: :invalid do
|
|
177
178
|
before do
|
|
178
179
|
module ControllerActions
|
|
179
180
|
remove_method :doorkeeper_unauthorized_render_options
|
|
180
181
|
|
|
181
182
|
def doorkeeper_unauthorized_render_options(**)
|
|
182
|
-
{ plain:
|
|
183
|
+
{ plain: "Unauthorized" }
|
|
183
184
|
end
|
|
184
185
|
end
|
|
185
186
|
end
|
|
@@ -192,17 +193,17 @@ describe 'doorkeeper authorize filter' do
|
|
|
192
193
|
end
|
|
193
194
|
end
|
|
194
195
|
|
|
195
|
-
it
|
|
196
|
+
it "it renders a custom text response", token: :invalid do
|
|
196
197
|
get :index, params: { access_token: token_string }
|
|
197
198
|
expect(response.status).to eq 401
|
|
198
|
-
expect(response.content_type).to eq(
|
|
199
|
-
expect(response.header[
|
|
200
|
-
expect(response.body).to eq(
|
|
199
|
+
expect(response.content_type).to eq("text/plain")
|
|
200
|
+
expect(response.header["WWW-Authenticate"]).to match(/^Bearer/)
|
|
201
|
+
expect(response.body).to eq("Unauthorized")
|
|
201
202
|
end
|
|
202
203
|
end
|
|
203
204
|
end
|
|
204
205
|
|
|
205
|
-
context
|
|
206
|
+
context "when custom forbidden render options are configured" do
|
|
206
207
|
before do
|
|
207
208
|
expect(Doorkeeper::AccessToken).to receive(:by_token).with(token_string).and_return(token)
|
|
208
209
|
expect(token).to receive(:acceptable?).with([:write]).and_return(false)
|
|
@@ -224,86 +225,129 @@ describe 'doorkeeper authorize filter' do
|
|
|
224
225
|
|
|
225
226
|
let(:token) do
|
|
226
227
|
double(Doorkeeper::AccessToken,
|
|
227
|
-
accessible?: true, scopes: [
|
|
228
|
+
accessible?: true, scopes: ["public"], revoked?: false,
|
|
228
229
|
expired?: false, previous_refresh_token: "",
|
|
229
230
|
revoke_previous_refresh_token!: true)
|
|
230
231
|
end
|
|
231
232
|
|
|
232
|
-
let(:token_string) {
|
|
233
|
+
let(:token_string) { "1A2DUWE" }
|
|
233
234
|
|
|
234
|
-
context
|
|
235
|
+
context "with a JSON custom render" do
|
|
235
236
|
before do
|
|
236
237
|
module ControllerActions
|
|
237
238
|
remove_method :doorkeeper_forbidden_render_options
|
|
238
239
|
|
|
239
240
|
def doorkeeper_forbidden_render_options(*)
|
|
240
|
-
{ json: { error_message:
|
|
241
|
+
{ json: { error_message: "Forbidden" } }
|
|
241
242
|
end
|
|
242
243
|
end
|
|
243
244
|
end
|
|
244
245
|
|
|
245
|
-
it
|
|
246
|
+
it "renders a custom JSON response" do
|
|
246
247
|
get :index, params: { access_token: token_string }
|
|
247
|
-
expect(response.header).to_not include(
|
|
248
|
-
expect(response.content_type).to eq(
|
|
248
|
+
expect(response.header).to_not include("WWW-Authenticate")
|
|
249
|
+
expect(response.content_type).to eq("application/json")
|
|
249
250
|
expect(response.status).to eq 403
|
|
250
251
|
|
|
251
252
|
expect(json_response).not_to be_nil
|
|
252
|
-
expect(json_response[
|
|
253
|
+
expect(json_response["error_message"]).to match("Forbidden")
|
|
253
254
|
end
|
|
254
255
|
end
|
|
255
256
|
|
|
256
|
-
context
|
|
257
|
+
context "with a status and JSON custom render" do
|
|
257
258
|
before do
|
|
258
259
|
module ControllerActions
|
|
259
260
|
remove_method :doorkeeper_forbidden_render_options
|
|
260
261
|
def doorkeeper_forbidden_render_options(*)
|
|
261
|
-
{ json: { error_message:
|
|
262
|
-
respond_not_found_when_forbidden: true }
|
|
262
|
+
{ json: { error_message: "Not Found" },
|
|
263
|
+
respond_not_found_when_forbidden: true, }
|
|
263
264
|
end
|
|
264
265
|
end
|
|
265
266
|
end
|
|
266
267
|
|
|
267
|
-
it
|
|
268
|
+
it "overrides the default status code" do
|
|
268
269
|
get :index, params: { access_token: token_string }
|
|
269
270
|
expect(response.status).to eq 404
|
|
270
271
|
end
|
|
271
272
|
end
|
|
272
273
|
|
|
273
|
-
context
|
|
274
|
+
context "with a text custom render" do
|
|
274
275
|
before do
|
|
275
276
|
module ControllerActions
|
|
276
277
|
remove_method :doorkeeper_forbidden_render_options
|
|
277
278
|
|
|
278
279
|
def doorkeeper_forbidden_render_options(*)
|
|
279
|
-
{ plain:
|
|
280
|
+
{ plain: "Forbidden" }
|
|
280
281
|
end
|
|
281
282
|
end
|
|
282
283
|
end
|
|
283
284
|
|
|
284
|
-
it
|
|
285
|
+
it "renders a custom status code and text response" do
|
|
285
286
|
get :index, params: { access_token: token_string }
|
|
286
|
-
expect(response.header).to_not include(
|
|
287
|
+
expect(response.header).to_not include("WWW-Authenticate")
|
|
287
288
|
expect(response.status).to eq 403
|
|
288
|
-
expect(response.body).to eq(
|
|
289
|
+
expect(response.body).to eq("Forbidden")
|
|
289
290
|
end
|
|
290
291
|
end
|
|
291
292
|
|
|
292
|
-
context
|
|
293
|
+
context "with a status and text custom render" do
|
|
293
294
|
before do
|
|
294
295
|
module ControllerActions
|
|
295
296
|
remove_method :doorkeeper_forbidden_render_options
|
|
296
297
|
|
|
297
298
|
def doorkeeper_forbidden_render_options(*)
|
|
298
|
-
{ respond_not_found_when_forbidden: true, plain:
|
|
299
|
+
{ respond_not_found_when_forbidden: true, plain: "Not Found" }
|
|
299
300
|
end
|
|
300
301
|
end
|
|
301
302
|
end
|
|
302
303
|
|
|
303
|
-
it
|
|
304
|
+
it "overrides the default status code" do
|
|
304
305
|
get :index, params: { access_token: token_string }
|
|
305
306
|
expect(response.status).to eq 404
|
|
306
307
|
end
|
|
307
308
|
end
|
|
308
309
|
end
|
|
310
|
+
|
|
311
|
+
context "when handle_auth_errors option is set to :raise" do
|
|
312
|
+
subject { get :index, params: { access_token: token_string } }
|
|
313
|
+
|
|
314
|
+
before do
|
|
315
|
+
config_is_set(:handle_auth_errors, :raise)
|
|
316
|
+
end
|
|
317
|
+
|
|
318
|
+
controller do
|
|
319
|
+
before_action :doorkeeper_authorize!
|
|
320
|
+
include ControllerActions
|
|
321
|
+
end
|
|
322
|
+
|
|
323
|
+
context "when token is unknown" do
|
|
324
|
+
it "raises Doorkeeper::Errors::TokenUnknown exception", token: :invalid do
|
|
325
|
+
expect { subject }.to raise_error(Doorkeeper::Errors::TokenUnknown)
|
|
326
|
+
end
|
|
327
|
+
end
|
|
328
|
+
|
|
329
|
+
context "when token is expired" do
|
|
330
|
+
it "raises Doorkeeper::Errors::TokenExpired exception", token: :expired do
|
|
331
|
+
expect { subject }.to raise_error(Doorkeeper::Errors::TokenExpired)
|
|
332
|
+
end
|
|
333
|
+
end
|
|
334
|
+
|
|
335
|
+
context "when token is revoked" do
|
|
336
|
+
it "raises Doorkeeper::Errors::TokenRevoked exception", token: :revoked do
|
|
337
|
+
expect { subject }.to raise_error(Doorkeeper::Errors::TokenRevoked)
|
|
338
|
+
end
|
|
339
|
+
end
|
|
340
|
+
|
|
341
|
+
context "when token is forbidden" do
|
|
342
|
+
it "raises Doorkeeper::Errors::TokenForbidden exception", token: :forbidden do
|
|
343
|
+
expect { subject }.to raise_error(Doorkeeper::Errors::TokenForbidden)
|
|
344
|
+
end
|
|
345
|
+
end
|
|
346
|
+
|
|
347
|
+
context "when token is valid" do
|
|
348
|
+
it "allows into index action", token: :valid do
|
|
349
|
+
expect(response).to be_successful
|
|
350
|
+
end
|
|
351
|
+
end
|
|
352
|
+
end
|
|
309
353
|
end
|
|
@@ -1,46 +1,48 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "spec_helper"
|
|
2
4
|
|
|
3
5
|
describe Doorkeeper::TokenInfoController do
|
|
4
|
-
describe
|
|
6
|
+
describe "when requesting token info with valid token" do
|
|
5
7
|
let(:doorkeeper_token) { FactoryBot.create(:access_token) }
|
|
6
8
|
|
|
7
|
-
describe
|
|
8
|
-
it
|
|
9
|
+
describe "successful request" do
|
|
10
|
+
it "responds with token info" do
|
|
9
11
|
get :show, params: { access_token: doorkeeper_token.token }
|
|
10
12
|
|
|
11
13
|
expect(response.body).to eq(doorkeeper_token.to_json)
|
|
12
14
|
end
|
|
13
15
|
|
|
14
|
-
it
|
|
16
|
+
it "responds with a 200 status" do
|
|
15
17
|
get :show, params: { access_token: doorkeeper_token.token }
|
|
16
18
|
|
|
17
19
|
expect(response.status).to eq 200
|
|
18
20
|
end
|
|
19
21
|
end
|
|
20
22
|
|
|
21
|
-
describe
|
|
22
|
-
it
|
|
23
|
+
describe "invalid token response" do
|
|
24
|
+
it "responds with 401 when doorkeeper_token is not valid" do
|
|
23
25
|
get :show
|
|
24
26
|
|
|
25
27
|
expect(response.status).to eq 401
|
|
26
|
-
expect(response.headers[
|
|
28
|
+
expect(response.headers["WWW-Authenticate"]).to match(/^Bearer/)
|
|
27
29
|
end
|
|
28
30
|
|
|
29
|
-
it
|
|
31
|
+
it "responds with 401 when doorkeeper_token is invalid, expired or revoked" do
|
|
30
32
|
allow(controller).to receive(:doorkeeper_token).and_return(doorkeeper_token)
|
|
31
33
|
allow(doorkeeper_token).to receive(:accessible?).and_return(false)
|
|
32
34
|
|
|
33
35
|
get :show
|
|
34
36
|
|
|
35
37
|
expect(response.status).to eq 401
|
|
36
|
-
expect(response.headers[
|
|
38
|
+
expect(response.headers["WWW-Authenticate"]).to match(/^Bearer/)
|
|
37
39
|
end
|
|
38
40
|
|
|
39
|
-
it
|
|
41
|
+
it "responds body message for error" do
|
|
40
42
|
get :show
|
|
41
43
|
|
|
42
44
|
expect(response.body).to eq(
|
|
43
|
-
Doorkeeper::OAuth::
|
|
45
|
+
Doorkeeper::OAuth::InvalidTokenResponse.new.body.to_json
|
|
44
46
|
)
|
|
45
47
|
end
|
|
46
48
|
end
|