doorkeeper 0.5.0 → 0.6.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of doorkeeper might be problematic. Click here for more details.
- data/.travis.yml +15 -6
- data/CHANGELOG.md +19 -1
- data/Gemfile +23 -7
- data/README.md +62 -27
- data/app/controllers/doorkeeper/application_controller.rb +1 -1
- data/app/controllers/doorkeeper/authorizations_controller.rb +45 -35
- data/app/controllers/doorkeeper/token_info_controller.rb +10 -9
- data/app/controllers/doorkeeper/tokens_controller.rb +13 -32
- data/app/validators/redirect_uri_validator.rb +11 -0
- data/app/views/doorkeeper/applications/_form.html.erb +6 -1
- data/app/views/doorkeeper/applications/edit.html.erb +2 -2
- data/app/views/doorkeeper/applications/new.html.erb +2 -2
- data/app/views/doorkeeper/applications/show.html.erb +4 -1
- data/app/views/doorkeeper/authorizations/error.html.erb +1 -1
- data/app/views/doorkeeper/authorizations/new.html.erb +17 -17
- data/app/views/doorkeeper/authorizations/show.html.erb +4 -0
- data/config/locales/en.yml +10 -0
- data/doorkeeper.gemspec +3 -3
- data/lib/doorkeeper.rb +11 -2
- data/lib/doorkeeper/config.rb +6 -1
- data/lib/doorkeeper/errors.rb +15 -0
- data/lib/doorkeeper/helpers/controller.rb +24 -0
- data/lib/doorkeeper/models/access_grant.rb +1 -1
- data/lib/doorkeeper/models/access_token.rb +2 -3
- data/lib/doorkeeper/models/active_record/access_token.rb +6 -0
- data/lib/doorkeeper/models/mongo_mapper/access_grant.rb +28 -0
- data/lib/doorkeeper/models/mongo_mapper/access_token.rb +51 -0
- data/lib/doorkeeper/models/mongo_mapper/application.rb +30 -0
- data/lib/doorkeeper/models/mongo_mapper/revocable.rb +15 -0
- data/lib/doorkeeper/models/{mongoid → mongoid2}/access_grant.rb +1 -1
- data/lib/doorkeeper/models/{mongoid → mongoid2}/access_token.rb +6 -0
- data/lib/doorkeeper/models/{mongoid → mongoid2}/application.rb +2 -2
- data/lib/doorkeeper/models/mongoid3/access_grant.rb +22 -0
- data/lib/doorkeeper/models/mongoid3/access_token.rb +41 -0
- data/lib/doorkeeper/models/mongoid3/application.rb +22 -0
- data/lib/doorkeeper/oauth/authorization/code.rb +9 -17
- data/lib/doorkeeper/oauth/authorization/token.rb +8 -18
- data/lib/doorkeeper/oauth/authorization/uri_builder.rb +2 -0
- data/lib/doorkeeper/oauth/authorization_code_request.rb +82 -0
- data/lib/doorkeeper/oauth/client_credentials_request.rb +2 -4
- data/lib/doorkeeper/oauth/code_request.rb +28 -0
- data/lib/doorkeeper/oauth/code_response.rb +37 -0
- data/lib/doorkeeper/oauth/error_response.rb +23 -9
- data/lib/doorkeeper/oauth/helpers/uri_checker.rb +4 -0
- data/lib/doorkeeper/oauth/password_access_token_request.rb +21 -65
- data/lib/doorkeeper/oauth/pre_authorization.rb +62 -0
- data/lib/doorkeeper/oauth/refresh_token_request.rb +58 -0
- data/lib/doorkeeper/oauth/token_request.rb +28 -0
- data/lib/doorkeeper/oauth/token_response.rb +29 -0
- data/lib/doorkeeper/rails/routes.rb +4 -3
- data/lib/doorkeeper/request.rb +33 -0
- data/lib/doorkeeper/request/authorization_code.rb +23 -0
- data/lib/doorkeeper/request/client_credentials.rb +23 -0
- data/lib/doorkeeper/request/code.rb +24 -0
- data/lib/doorkeeper/request/password.rb +23 -0
- data/lib/doorkeeper/request/refresh_token.rb +23 -0
- data/lib/doorkeeper/request/token.rb +24 -0
- data/lib/doorkeeper/server.rb +54 -0
- data/lib/doorkeeper/validations.rb +1 -0
- data/lib/doorkeeper/version.rb +1 -1
- data/lib/generators/doorkeeper/mongo_mapper/indexes_generator.rb +12 -0
- data/lib/generators/doorkeeper/templates/README +15 -1
- data/lib/generators/doorkeeper/templates/indexes.rb +3 -0
- data/lib/generators/doorkeeper/templates/initializer.rb +8 -1
- data/script/run_all +9 -9
- data/spec/controllers/authorizations_controller_spec.rb +8 -19
- data/spec/controllers/token_info_controller_spec.rb +9 -9
- data/spec/controllers/tokens_controller_spec.rb +2 -1
- data/spec/dummy/app/models/user.rb +11 -4
- data/spec/dummy/config/application.rb +8 -1
- data/spec/dummy/config/boot.rb +1 -1
- data/spec/dummy/config/initializers/doorkeeper.rb +9 -1
- data/spec/dummy/config/mongo.yml +11 -0
- data/spec/dummy/config/{mongoid.yml → mongoid2.yml} +3 -1
- data/spec/dummy/config/mongoid3.yml +18 -0
- data/spec/generators/install_generator_spec.rb +1 -0
- data/spec/lib/oauth/authorization_code_request_spec.rb +80 -0
- data/spec/lib/oauth/client_credentials_request_spec.rb +1 -3
- data/spec/lib/oauth/code_request_spec.rb +44 -0
- data/spec/lib/oauth/error_response_spec.rb +7 -7
- data/spec/lib/oauth/password_access_token_request_spec.rb +30 -143
- data/spec/lib/oauth/pre_authorization_spec.rb +80 -0
- data/spec/lib/oauth/refresh_token_request_spec.rb +56 -0
- data/spec/lib/oauth/token_request_spec.rb +46 -0
- data/spec/lib/oauth/{client_credentials/response_spec.rb → token_response_spec.rb} +13 -19
- data/spec/lib/server_spec.rb +24 -0
- data/spec/requests/endpoints/authorization_spec.rb +11 -27
- data/spec/requests/endpoints/token_spec.rb +17 -0
- data/spec/requests/flows/authorization_code_errors_spec.rb +0 -45
- data/spec/requests/flows/authorization_code_spec.rb +12 -2
- data/spec/requests/flows/client_credentials_spec.rb +1 -1
- data/spec/requests/flows/password_spec.rb +1 -0
- data/spec/requests/flows/refresh_token_spec.rb +6 -4
- data/spec/spec_helper_integration.rb +4 -2
- data/spec/support/orm/mongo_mapper.rb +26 -0
- data/spec/support/orm/mongoid.rb +7 -2
- data/spec/validators/redirect_uri_validator_spec.rb +11 -4
- metadata +67 -42
- data/gemfiles/gemfile.rails-3.1.x +0 -17
- data/gemfiles/gemfile.rails-3.2.x +0 -17
- data/lib/doorkeeper/oauth/access_token_request.rb +0 -139
- data/lib/doorkeeper/oauth/authorization_request.rb +0 -114
- data/lib/doorkeeper/oauth/client_credentials/response.rb +0 -42
- data/spec/lib/oauth/access_token_request_spec.rb +0 -246
- data/spec/lib/oauth/authorization_request_spec.rb +0 -287
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'spec_helper_integration'
|
2
|
+
|
3
|
+
module Doorkeeper::OAuth
|
4
|
+
describe RefreshTokenRequest do
|
5
|
+
let(:server) { mock :server, :access_token_expires_in => 2.minutes }
|
6
|
+
let!(:refresh_token) { FactoryGirl.create(:access_token, :use_refresh_token => true) }
|
7
|
+
let(:client) { refresh_token.application }
|
8
|
+
|
9
|
+
subject do
|
10
|
+
RefreshTokenRequest.new server, refresh_token, client
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'issues a new token for the client' do
|
14
|
+
expect do
|
15
|
+
subject.authorize
|
16
|
+
end.to change { client.access_tokens.count }.by(1)
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'revokes the previous token' do
|
20
|
+
expect do
|
21
|
+
subject.authorize
|
22
|
+
end.to change { refresh_token.revoked? }.from(false).to(true)
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'requires the refresh token' do
|
26
|
+
subject.refresh_token = nil
|
27
|
+
subject.validate
|
28
|
+
subject.error.should == :invalid_request
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'requires client' do
|
32
|
+
subject.client = nil
|
33
|
+
subject.validate
|
34
|
+
subject.error.should == :invalid_client
|
35
|
+
end
|
36
|
+
|
37
|
+
it "requires the token's client and current client to match" do
|
38
|
+
subject.client = FactoryGirl.create(:application)
|
39
|
+
subject.validate
|
40
|
+
subject.error.should == :invalid_client
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'rejects revoked tokens' do
|
44
|
+
refresh_token.revoke
|
45
|
+
subject.validate
|
46
|
+
subject.error.should == :invalid_request
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'accepts expired tokens' do
|
50
|
+
refresh_token.expires_in = -1
|
51
|
+
refresh_token.save
|
52
|
+
subject.validate
|
53
|
+
subject.should be_valid
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'spec_helper_integration'
|
2
|
+
|
3
|
+
module Doorkeeper::OAuth
|
4
|
+
describe TokenRequest do
|
5
|
+
let :pre_auth do
|
6
|
+
mock(:pre_auth, {
|
7
|
+
:client => mock(:application, :id => 9990),
|
8
|
+
:redirect_uri => 'http://tst.com/cb',
|
9
|
+
:state => nil,
|
10
|
+
:scopes => nil,
|
11
|
+
:error => nil,
|
12
|
+
:authorizable? => true
|
13
|
+
})
|
14
|
+
end
|
15
|
+
|
16
|
+
let :owner do
|
17
|
+
mock :owner, :id => 7866
|
18
|
+
end
|
19
|
+
|
20
|
+
subject do
|
21
|
+
TokenRequest.new(pre_auth, owner)
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'creates an access token' do
|
25
|
+
expect do
|
26
|
+
subject.authorize
|
27
|
+
end.to change { Doorkeeper::AccessToken.count }.by(1)
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'returns a code response' do
|
31
|
+
subject.authorize.should be_a(CodeResponse)
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'does not create token when not authorizable' do
|
35
|
+
pre_auth.stub :authorizable? => false
|
36
|
+
expect do
|
37
|
+
subject.authorize
|
38
|
+
end.to_not change { Doorkeeper::AccessToken.count }
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'returns a error response' do
|
42
|
+
pre_auth.stub :authorizable? => false
|
43
|
+
subject.authorize.should be_a(ErrorResponse)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -1,9 +1,9 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require 'doorkeeper/oauth/
|
2
|
+
require 'doorkeeper/oauth/token_response'
|
3
3
|
|
4
|
-
|
5
|
-
describe
|
6
|
-
subject {
|
4
|
+
module Doorkeeper::OAuth
|
5
|
+
describe TokenResponse do
|
6
|
+
subject { TokenResponse.new(stub.as_null_object) }
|
7
7
|
|
8
8
|
it 'includes access token response headers' do
|
9
9
|
headers = subject.headers
|
@@ -11,28 +11,22 @@ class Doorkeeper::OAuth::ClientCredentialsRequest
|
|
11
11
|
headers.fetch('Pragma').should == 'no-cache'
|
12
12
|
end
|
13
13
|
|
14
|
-
it 'status is
|
15
|
-
subject.status.should == :
|
14
|
+
it 'status is ok' do
|
15
|
+
subject.status.should == :ok
|
16
16
|
end
|
17
17
|
|
18
|
-
|
19
|
-
subject.token_type.should == 'bearer'
|
20
|
-
end
|
21
|
-
|
22
|
-
it 'can be serialized to JSON' do
|
23
|
-
subject.should respond_to(:to_json)
|
24
|
-
end
|
25
|
-
|
26
|
-
context 'attributes' do
|
18
|
+
describe '.body' do
|
27
19
|
let(:access_token) do
|
28
20
|
mock :access_token, {
|
29
21
|
:token => 'some-token',
|
30
22
|
:expires_in => '3600',
|
31
|
-
:scopes_string => 'two scopes'
|
23
|
+
:scopes_string => 'two scopes',
|
24
|
+
:refresh_token => 'some-refresh-token',
|
25
|
+
:token_type => 'bearer'
|
32
26
|
}
|
33
27
|
end
|
34
28
|
|
35
|
-
subject {
|
29
|
+
subject { TokenResponse.new(access_token).body }
|
36
30
|
|
37
31
|
it 'includes :access_token' do
|
38
32
|
subject['access_token'].should == 'some-token'
|
@@ -50,8 +44,8 @@ class Doorkeeper::OAuth::ClientCredentialsRequest
|
|
50
44
|
subject['scope'].should == 'two scopes'
|
51
45
|
end
|
52
46
|
|
53
|
-
it '
|
54
|
-
subject.
|
47
|
+
it 'includes :refresh_token' do
|
48
|
+
subject['refresh_token'].should == 'some-refresh-token'
|
55
49
|
end
|
56
50
|
end
|
57
51
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'active_support/all'
|
3
|
+
require 'doorkeeper/errors'
|
4
|
+
require 'doorkeeper/server'
|
5
|
+
|
6
|
+
describe Doorkeeper::Server do
|
7
|
+
let(:fake_class) { mock :fake_class }
|
8
|
+
|
9
|
+
subject do
|
10
|
+
described_class.new
|
11
|
+
end
|
12
|
+
|
13
|
+
describe '.authorization_request' do
|
14
|
+
it 'raises error when strategy does not exist' do
|
15
|
+
expect { subject.authorization_request(:duh) }.to raise_error(Doorkeeper::Errors::InvalidAuthorizationStrategy)
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'builds the request with selected strategy' do
|
19
|
+
stub_const 'Doorkeeper::Request::Code', fake_class
|
20
|
+
fake_class.should_receive(:build).with(subject)
|
21
|
+
subject.authorization_request :code
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -23,41 +23,25 @@ feature 'Authorization endpoint' do
|
|
23
23
|
i_should_see "Authorize MyApp to use your account?"
|
24
24
|
end
|
25
25
|
|
26
|
-
scenario
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
visit authorization_endpoint_url(:client => @client, :response_type => "token")
|
33
|
-
i_should_see "Authorize"
|
26
|
+
scenario "displays all requested scopes" do
|
27
|
+
default_scopes_exist :public
|
28
|
+
optional_scopes_exist :write
|
29
|
+
visit authorization_endpoint_url(:client => @client, :scope => "public write")
|
30
|
+
i_should_see "Access your public data"
|
31
|
+
i_should_see "Update your data"
|
34
32
|
end
|
35
33
|
end
|
36
34
|
|
37
|
-
context 'with
|
35
|
+
context 'with a invalid request' do
|
38
36
|
background do
|
39
37
|
create_resource_owner
|
40
38
|
sign_in
|
41
|
-
default_scopes_exist :public
|
42
|
-
optional_scopes_exist :write
|
43
39
|
end
|
44
40
|
|
45
|
-
scenario "displays
|
46
|
-
visit authorization_endpoint_url(:client => @client)
|
47
|
-
|
48
|
-
|
49
|
-
end
|
50
|
-
|
51
|
-
scenario "displays all requested scopes" do
|
52
|
-
visit authorization_endpoint_url(:client => @client, :scope => "public write")
|
53
|
-
i_should_see "Access your public data"
|
54
|
-
i_should_see "Update your data"
|
55
|
-
end
|
56
|
-
|
57
|
-
scenario "does not display default scope if it was not requested" do
|
58
|
-
visit authorization_endpoint_url(:client => @client, :scope => "write")
|
59
|
-
i_should_not_see "Access your public data"
|
60
|
-
i_should_see "Update your data"
|
41
|
+
scenario "displays the related error" do
|
42
|
+
visit authorization_endpoint_url(:client => @client, :response_type => "")
|
43
|
+
i_should_not_see "Authorize"
|
44
|
+
i_should_see_translated_error_message :unsupported_response_type
|
61
45
|
end
|
62
46
|
end
|
63
47
|
end
|
@@ -10,6 +10,7 @@ feature 'Token endpoint' do
|
|
10
10
|
post token_endpoint_url(:code => @authorization.token, :client => @client)
|
11
11
|
should_have_header 'Pragma', 'no-cache'
|
12
12
|
should_have_header 'Cache-Control', 'no-store'
|
13
|
+
should_have_header 'Content-Type', 'application/json; charset=utf-8'
|
13
14
|
end
|
14
15
|
|
15
16
|
scenario 'accepts client credentials with basic auth header' do
|
@@ -26,4 +27,20 @@ feature 'Token endpoint' do
|
|
26
27
|
should_have_json 'access_token', Doorkeeper::AccessToken.first.token
|
27
28
|
should_have_json 'expires_in', nil
|
28
29
|
end
|
30
|
+
|
31
|
+
scenario 'returns unsupported_grant_type for invalid grant_type param' do
|
32
|
+
post token_endpoint_url(:code => @authorization.token, :client => @client, :grant_type => 'nothing')
|
33
|
+
|
34
|
+
should_not_have_json 'access_token'
|
35
|
+
should_have_json 'error', 'unsupported_grant_type'
|
36
|
+
should_have_json 'error_description', translated_error_message('unsupported_grant_type')
|
37
|
+
end
|
38
|
+
|
39
|
+
scenario 'returns invalid_request if grant_type is missing' do
|
40
|
+
post token_endpoint_url(:code => @authorization.token, :client => @client, :grant_type => '')
|
41
|
+
|
42
|
+
should_not_have_json 'access_token'
|
43
|
+
should_have_json 'error', 'invalid_request'
|
44
|
+
should_have_json 'error_description', translated_error_message('invalid_request')
|
45
|
+
end
|
29
46
|
end
|
@@ -12,37 +12,6 @@ feature 'Authorization Code Flow Errors' do
|
|
12
12
|
access_grant_should_not_exist
|
13
13
|
end
|
14
14
|
|
15
|
-
scenario "redirects with :invalid_request error when :response_type is missing" do
|
16
|
-
visit authorization_endpoint_url(:client => @client, :response_type => "")
|
17
|
-
i_should_be_on_client_callback @client
|
18
|
-
url_should_have_param "error", "invalid_request"
|
19
|
-
url_should_have_param "error_description", translated_error_message(:invalid_request)
|
20
|
-
end
|
21
|
-
|
22
|
-
scenario "redirects with :unsupported_response_type error for invalid :response_type" do
|
23
|
-
visit authorization_endpoint_url(:client => @client, :response_type => "invalid")
|
24
|
-
i_should_be_on_client_callback @client
|
25
|
-
url_should_have_param "error", "unsupported_response_type"
|
26
|
-
url_should_have_param "error_description", translated_error_message(:unsupported_response_type)
|
27
|
-
end
|
28
|
-
|
29
|
-
[
|
30
|
-
[:client_id, :invalid_client],
|
31
|
-
[:redirect_uri, :invalid_redirect_uri],
|
32
|
-
].each do |error|
|
33
|
-
scenario "displays #{error.last.inspect} error for invalid #{error.first.inspect}" do
|
34
|
-
visit authorization_endpoint_url(:client => @client, error.first => "invalid")
|
35
|
-
i_should_not_see "Authorize"
|
36
|
-
i_should_see_translated_error_message error.last
|
37
|
-
end
|
38
|
-
|
39
|
-
scenario "displays #{error.last.inspect} error when #{error.first.inspect} is missing" do
|
40
|
-
visit authorization_endpoint_url(:client => @client, error.first => "")
|
41
|
-
i_should_not_see "Authorize"
|
42
|
-
i_should_see_translated_error_message error.last
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
15
|
context 'when access was denied' do
|
47
16
|
scenario 'redirects with error' do
|
48
17
|
visit authorization_endpoint_url(:client => @client)
|
@@ -63,20 +32,6 @@ feature 'Authorization Code Flow Errors' do
|
|
63
32
|
url_should_have_param "state", "return-this"
|
64
33
|
end
|
65
34
|
end
|
66
|
-
|
67
|
-
context 'with scopes' do
|
68
|
-
background do
|
69
|
-
optional_scopes_exist :write
|
70
|
-
end
|
71
|
-
|
72
|
-
scenario "redirects with :invalid_scope error when scope does not exists" do
|
73
|
-
visit authorization_endpoint_url(:client => @client, :scope => "invalid")
|
74
|
-
|
75
|
-
i_should_be_on_client_callback @client
|
76
|
-
url_should_have_param "error", "invalid_scope"
|
77
|
-
url_should_have_param "error_description", translated_error_message(:invalid_scope)
|
78
|
-
end
|
79
|
-
end
|
80
35
|
end
|
81
36
|
|
82
37
|
feature 'Authorization Code Flow Errors', 'after authorization' do
|
@@ -21,6 +21,18 @@ feature 'Authorization Code Flow' do
|
|
21
21
|
url_should_not_have_param("error")
|
22
22
|
end
|
23
23
|
|
24
|
+
scenario 'resource owner authorizes using test url' do
|
25
|
+
@client.redirect_uri = Doorkeeper.configuration.test_redirect_uri
|
26
|
+
@client.save!
|
27
|
+
visit authorization_endpoint_url(:client => @client)
|
28
|
+
click_on "Authorize"
|
29
|
+
|
30
|
+
access_grant_should_exist_for(@client, @resource_owner)
|
31
|
+
|
32
|
+
i_should_see 'Authorization code:'
|
33
|
+
i_should_see Doorkeeper::AccessGrant.first.token
|
34
|
+
end
|
35
|
+
|
24
36
|
scenario 'resource owner authorizes the client with state parameter set' do
|
25
37
|
visit authorization_endpoint_url(:client => @client, :state => "return-me")
|
26
38
|
click_on "Authorize"
|
@@ -69,8 +81,6 @@ feature 'Authorization Code Flow' do
|
|
69
81
|
should_have_json 'access_token', Doorkeeper::AccessToken.first.token
|
70
82
|
should_have_json 'token_type', "bearer"
|
71
83
|
should_have_json 'expires_in', Doorkeeper::AccessToken.first.expires_in
|
72
|
-
|
73
|
-
should_not_have_json 'refresh_token'
|
74
84
|
end
|
75
85
|
|
76
86
|
context 'with scopes' do
|
@@ -13,10 +13,10 @@ describe 'Client Credentials Request' do
|
|
13
13
|
should_have_json 'access_token', Doorkeeper::AccessToken.first.token
|
14
14
|
should_have_json 'expires_in', Doorkeeper.configuration.access_token_expires_in
|
15
15
|
should_have_json 'scope', ''
|
16
|
+
should_have_json 'refresh_token', nil
|
16
17
|
|
17
18
|
should_not_have_json 'error'
|
18
19
|
should_not_have_json 'error_description'
|
19
|
-
should_not_have_json 'refresh_token'
|
20
20
|
end
|
21
21
|
|
22
22
|
context 'with scopes' do
|
@@ -13,6 +13,7 @@ feature 'Resource Owner Password Credentials Flow inproperly set up' do
|
|
13
13
|
|
14
14
|
context 'with valid user credentials' do
|
15
15
|
scenario "should issue new token" do
|
16
|
+
pending 'Check a way to supress warnings here (or handle config better)'
|
16
17
|
expect {
|
17
18
|
post password_token_endpoint_url(:client => @client, :resource_owner => @resource_owner)
|
18
19
|
}.to_not change { Doorkeeper::AccessToken.count }
|
@@ -2,9 +2,9 @@ require 'spec_helper_integration'
|
|
2
2
|
|
3
3
|
feature "Refresh Token Flow" do
|
4
4
|
before do
|
5
|
-
Doorkeeper.configure {
|
5
|
+
Doorkeeper.configure {
|
6
6
|
orm DOORKEEPER_ORM
|
7
|
-
use_refresh_token
|
7
|
+
use_refresh_token
|
8
8
|
}
|
9
9
|
client_exists
|
10
10
|
end
|
@@ -53,17 +53,19 @@ feature "Refresh Token Flow" do
|
|
53
53
|
@token.reload.should be_revoked
|
54
54
|
end
|
55
55
|
|
56
|
+
# TODO: verify proper error code for this (previously was invalid_grant)
|
56
57
|
scenario "client gets an error for invalid refresh token" do
|
57
58
|
post refresh_token_endpoint_url(:client => @client, :refresh_token => "invalid")
|
58
59
|
should_not_have_json 'refresh_token'
|
59
|
-
should_have_json 'error', '
|
60
|
+
should_have_json 'error', 'invalid_request'
|
60
61
|
end
|
61
62
|
|
63
|
+
# TODO: verify proper error code for this (previously was invalid_grant)
|
62
64
|
scenario "client gets an error for revoked acccess token" do
|
63
65
|
@token.revoke
|
64
66
|
post refresh_token_endpoint_url(:client => @client, :refresh_token => @token.refresh_token)
|
65
67
|
should_not_have_json 'refresh_token'
|
66
|
-
should_have_json 'error', '
|
68
|
+
should_have_json 'error', 'invalid_request'
|
67
69
|
end
|
68
70
|
end
|
69
71
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
ENV["RAILS_ENV"] ||= 'test'
|
2
|
-
DOORKEEPER_ORM = (ENV[
|
2
|
+
DOORKEEPER_ORM = (ENV['orm'] || :active_record).to_sym
|
3
3
|
|
4
4
|
$:.unshift File.dirname(__FILE__)
|
5
5
|
|
@@ -14,7 +14,7 @@ puts "====> Doorkeeper.orm = #{Doorkeeper.configuration.orm.inspect}"
|
|
14
14
|
puts "====> Rails version: #{Rails.version}"
|
15
15
|
puts "====> Ruby version: #{RUBY_VERSION}"
|
16
16
|
|
17
|
-
require "support/orm/#{Doorkeeper.configuration.
|
17
|
+
require "support/orm/#{Doorkeeper.configuration.orm_name}"
|
18
18
|
|
19
19
|
ENGINE_RAILS_ROOT = File.join(File.dirname(__FILE__), '../')
|
20
20
|
|
@@ -35,4 +35,6 @@ RSpec.configure do |config|
|
|
35
35
|
config.after do
|
36
36
|
DatabaseCleaner.clean
|
37
37
|
end
|
38
|
+
|
39
|
+
config.order = 'random'
|
38
40
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
DatabaseCleaner[:mongo_mapper].strategy = :truncation
|
2
|
+
DatabaseCleaner[:mongo_mapper].clean_with :truncation
|
3
|
+
|
4
|
+
RSpec.configure do |config|
|
5
|
+
config.before :suite do
|
6
|
+
Doorkeeper::Application.create_indexes
|
7
|
+
Doorkeeper::AccessGrant.create_indexes
|
8
|
+
Doorkeeper::AccessToken.create_indexes
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
module Doorkeeper
|
13
|
+
class PlaceholderApplicationOwner
|
14
|
+
include MongoMapper::Document
|
15
|
+
|
16
|
+
set_collection_name "placeholder_application_owners"
|
17
|
+
many :applications, :class => Doorkeeper::Application
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
module OrmHelper
|
22
|
+
def mock_application_owner
|
23
|
+
PlaceholderApplicationOwner.new
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|