doorkeeper 2.1.3 → 2.1.4
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/README.md +36 -1
- data/gemfiles/Gemfile.common.rb +1 -1
- data/lib/doorkeeper/grape/authorization_decorator.rb +17 -0
- data/lib/doorkeeper/grape/helpers.rb +46 -0
- data/lib/doorkeeper/oauth/client_credentials/issuer.rb +3 -1
- data/lib/doorkeeper/oauth/client_credentials/validation.rb +2 -2
- data/lib/doorkeeper/oauth/refresh_token_request.rb +1 -1
- data/lib/doorkeeper/version.rb +1 -1
- data/spec/dummy/app/controllers/full_protected_resources_controller.rb +1 -1
- data/spec/factories.rb +2 -0
- data/spec/lib/oauth/client_credentials/issuer_spec.rb +27 -1
- data/spec/lib/oauth/client_credentials/validation_spec.rb +6 -4
- data/spec/lib/oauth/client_credentials_request_spec.rb +42 -2
- data/spec/lib/oauth/refresh_token_request_spec.rb +15 -0
- data/spec/models/doorkeeper/application_spec.rb +1 -3
- data/spec/requests/protected_resources/private_api_spec.rb +16 -4
- data/spec/support/orm/active_record.rb +0 -8
- data/spec/support/orm/mongo_mapper.rb +0 -15
- data/spec/support/orm/mongoid.rb +0 -20
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f81bfc8acb70b14d07f1d1cfa39d608b70488890
|
4
|
+
data.tar.gz: e27b15693c23faf2348358e307757a0cdf088e7d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f0981eb39aba13e7191309b2d6703d58c175dd28df746867b1b466f9a62c9e5978f705f7df617268d082a210ff4bc5da1206a17849a0e1b0ee87746cf96d77fb
|
7
|
+
data.tar.gz: 207f6e7ec14a8369e3c27ee9af38a87d273556681438938c61c80454dd23628c838b2ff4c8e462e49ce6ed0cdfcf99481fb9c54b5b8752422a598c9bf238d78b
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 2.1.4
|
4
|
+
|
5
|
+
- [#595] HTTP spec: Add `scope` for refresh token scope param
|
6
|
+
- [#596] Limit scopes in app scopes for client credentials
|
7
|
+
- [#567] Add Grape helpers for easier integration with Grape framework
|
8
|
+
- [#606] Add custom access token expiration support for Client Credentials flow
|
9
|
+
|
10
|
+
|
3
11
|
## 2.1.3
|
4
12
|
|
5
13
|
- [#588] Fixes scopes_match? bug that skipped authorization form in some cases
|
data/README.md
CHANGED
@@ -5,7 +5,11 @@
|
|
5
5
|
[![Code Climate](https://codeclimate.com/github/applicake/doorkeeper.svg)](https://codeclimate.com/github/applicake/doorkeeper)
|
6
6
|
[![Gem Version](https://badge.fury.io/rb/doorkeeper.svg)](https://rubygems.org/gems/doorkeeper)
|
7
7
|
|
8
|
-
Doorkeeper is a gem that makes it easy to introduce OAuth 2 provider
|
8
|
+
Doorkeeper is a gem that makes it easy to introduce OAuth 2 provider
|
9
|
+
functionality to your Rails or Grape application.
|
10
|
+
|
11
|
+
[PR 567]: https://github.com/doorkeeper-gem/doorkeeper/pull/567
|
12
|
+
|
9
13
|
|
10
14
|
## Documentation valid for `master` branch
|
11
15
|
|
@@ -25,6 +29,7 @@ https://github.com/doorkeeper-gem/doorkeeper/releases.
|
|
25
29
|
- [Routes](#routes)
|
26
30
|
- [Authenticating](#authenticating)
|
27
31
|
- [Protecting resources with OAuth (a.k.a your API endpoint)](#protecting-resources-with-oauth-aka-your-api-endpoint)
|
32
|
+
- [Protect your API with OAuth when using Grape](#protect-your-api-with-oauth-when-using-grape)
|
28
33
|
- [Route Constraints and other integrations](#route-constraints-and-other-integrations)
|
29
34
|
- [Access Token Scopes](#access-token-scopes)
|
30
35
|
- [Authenticated resource owner](#authenticated-resource-owner)
|
@@ -169,6 +174,36 @@ end
|
|
169
174
|
You can pass any option `before_action` accepts, such as `if`, `only`,
|
170
175
|
`except`, and others.
|
171
176
|
|
177
|
+
### Protect your API with OAuth when using Grape
|
178
|
+
|
179
|
+
As of [PR 567] doorkeeper has helpers for Grape. One of them is
|
180
|
+
`doorkeeper_authorize!` and can be used in a similar way as an example above.
|
181
|
+
Note that you have to use `require 'doorkeeper/grape/helpers'` and
|
182
|
+
`helpers Doorkeeper::Grape::Helpers`.
|
183
|
+
|
184
|
+
For more information about integration with Grape see the [Wiki].
|
185
|
+
|
186
|
+
[PR 567]: https://github.com/doorkeeper-gem/doorkeeper/pull/567
|
187
|
+
[Wiki]: https://github.com/doorkeeper-gem/doorkeeper/wiki/Grape-Integration
|
188
|
+
|
189
|
+
``` ruby
|
190
|
+
require 'doorkeeper/grape/helpers'
|
191
|
+
|
192
|
+
module API
|
193
|
+
module V1
|
194
|
+
class Users < Grape::API
|
195
|
+
helpers Doorkeeper::Grape::Helpers
|
196
|
+
|
197
|
+
before do
|
198
|
+
doorkeeper_authorize!
|
199
|
+
end
|
200
|
+
|
201
|
+
# ...
|
202
|
+
end
|
203
|
+
end
|
204
|
+
end
|
205
|
+
```
|
206
|
+
|
172
207
|
|
173
208
|
### Route Constraints and other integrations
|
174
209
|
|
data/gemfiles/Gemfile.common.rb
CHANGED
@@ -0,0 +1,17 @@
|
|
1
|
+
module Doorkeeper
|
2
|
+
module Grape
|
3
|
+
class AuthorizationDecorator < SimpleDelegator
|
4
|
+
def parameters
|
5
|
+
params
|
6
|
+
end
|
7
|
+
|
8
|
+
def authorization
|
9
|
+
env = __getobj__.env
|
10
|
+
env['HTTP_AUTHORIZATION'] ||
|
11
|
+
env['X-HTTP_AUTHORIZATION'] ||
|
12
|
+
env['X_HTTP_AUTHORIZATION'] ||
|
13
|
+
env['REDIRECT_X_HTTP_AUTHORIZATION']
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'doorkeeper/grape/authorization_decorator'
|
2
|
+
|
3
|
+
module Doorkeeper
|
4
|
+
module Grape
|
5
|
+
module Helpers
|
6
|
+
extend ::Grape::API::Helpers
|
7
|
+
include Doorkeeper::Rails::Helpers
|
8
|
+
|
9
|
+
# endpoint specific scopes > parameter scopes > default scopes
|
10
|
+
def doorkeeper_authorize!(*scopes)
|
11
|
+
endpoint_scopes = env['api.endpoint'].options[:route_options][:scopes]
|
12
|
+
scopes = if endpoint_scopes
|
13
|
+
Doorkeeper::OAuth::Scopes.from_array(endpoint_scopes)
|
14
|
+
elsif scopes && !scopes.empty?
|
15
|
+
Doorkeeper::OAuth::Scopes.from_array(scopes)
|
16
|
+
end
|
17
|
+
|
18
|
+
super(*scopes)
|
19
|
+
end
|
20
|
+
|
21
|
+
def doorkeeper_render_error_with(error)
|
22
|
+
status_code = case error.status
|
23
|
+
when :unauthorized
|
24
|
+
401
|
25
|
+
when :forbidden
|
26
|
+
403
|
27
|
+
end
|
28
|
+
|
29
|
+
error!({ error: error.description }, status_code)
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def doorkeeper_token
|
35
|
+
@_doorkeeper_token ||= OAuth::Token.authenticate(
|
36
|
+
decorated_request,
|
37
|
+
*Doorkeeper.configuration.access_token_methods
|
38
|
+
)
|
39
|
+
end
|
40
|
+
|
41
|
+
def decorated_request
|
42
|
+
AuthorizationDecorator.new(request)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -24,11 +24,13 @@ module Doorkeeper
|
|
24
24
|
private
|
25
25
|
|
26
26
|
def create_token(client, scopes, creator)
|
27
|
+
ttl = Authorization::Token.access_token_expires_in(@server, client)
|
28
|
+
|
27
29
|
creator.call(
|
28
30
|
client,
|
29
31
|
scopes,
|
30
32
|
use_refresh_token: false,
|
31
|
-
expires_in:
|
33
|
+
expires_in: ttl
|
32
34
|
)
|
33
35
|
end
|
34
36
|
end
|
@@ -25,7 +25,7 @@ module Doorkeeper
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def validate_scopes
|
28
|
-
return true unless @request.
|
28
|
+
return true unless @request.scopes.present?
|
29
29
|
|
30
30
|
application_scopes = if @client.present?
|
31
31
|
@client.application.scopes
|
@@ -34,7 +34,7 @@ module Doorkeeper
|
|
34
34
|
end
|
35
35
|
|
36
36
|
ScopeChecker.valid?(
|
37
|
-
@request.
|
37
|
+
@request.scopes.to_s,
|
38
38
|
@server.scopes,
|
39
39
|
application_scopes
|
40
40
|
)
|
@@ -18,7 +18,7 @@ module Doorkeeper
|
|
18
18
|
@server = server
|
19
19
|
@refresh_token = refresh_token
|
20
20
|
@credentials = credentials
|
21
|
-
@original_scopes = parameters[:scopes]
|
21
|
+
@original_scopes = parameters[:scope] || parameters[:scopes]
|
22
22
|
@refresh_token_parameter = parameters[:refresh_token]
|
23
23
|
|
24
24
|
if credentials
|
data/lib/doorkeeper/version.rb
CHANGED
data/spec/factories.rb
CHANGED
@@ -5,7 +5,13 @@ require 'doorkeeper/oauth/client_credentials/issuer'
|
|
5
5
|
class Doorkeeper::OAuth::ClientCredentialsRequest
|
6
6
|
describe Issuer do
|
7
7
|
let(:creator) { double :acces_token_creator }
|
8
|
-
let(:server)
|
8
|
+
let(:server) do
|
9
|
+
double(
|
10
|
+
:server,
|
11
|
+
access_token_expires_in: 100,
|
12
|
+
custom_access_token_expires_in: ->(_app) { nil }
|
13
|
+
)
|
14
|
+
end
|
9
15
|
let(:validation) { double :validation, valid?: true }
|
10
16
|
|
11
17
|
subject { Issuer.new(server, validation) }
|
@@ -55,6 +61,26 @@ class Doorkeeper::OAuth::ClientCredentialsRequest
|
|
55
61
|
expect(subject.create(client, scopes, creator)).to be_falsey
|
56
62
|
end
|
57
63
|
end
|
64
|
+
|
65
|
+
context 'with custom expirations' do
|
66
|
+
let(:custom_ttl) { 1233 }
|
67
|
+
let(:server) do
|
68
|
+
double(
|
69
|
+
:server,
|
70
|
+
custom_access_token_expires_in: ->(_app) { custom_ttl }
|
71
|
+
)
|
72
|
+
end
|
73
|
+
|
74
|
+
it 'creates with correct token parameters' do
|
75
|
+
expect(creator).to receive(:call).with(
|
76
|
+
client,
|
77
|
+
scopes,
|
78
|
+
expires_in: custom_ttl,
|
79
|
+
use_refresh_token: false
|
80
|
+
)
|
81
|
+
subject.create client, scopes, creator
|
82
|
+
end
|
83
|
+
end
|
58
84
|
end
|
59
85
|
end
|
60
86
|
end
|
@@ -7,7 +7,7 @@ class Doorkeeper::OAuth::ClientCredentialsRequest
|
|
7
7
|
let(:server) { double :server, scopes: nil }
|
8
8
|
let(:application) { double scopes: nil }
|
9
9
|
let(:client) { double application: application }
|
10
|
-
let(:request) { double :request, client: client,
|
10
|
+
let(:request) { double :request, client: client, scopes: nil }
|
11
11
|
|
12
12
|
subject { Validation.new(server, request) }
|
13
13
|
|
@@ -24,7 +24,8 @@ class Doorkeeper::OAuth::ClientCredentialsRequest
|
|
24
24
|
it 'is invalid when scopes are not included in the server' do
|
25
25
|
server_scopes = Doorkeeper::OAuth::Scopes.from_string 'email'
|
26
26
|
allow(server).to receive(:scopes).and_return(server_scopes)
|
27
|
-
allow(request).to receive(:
|
27
|
+
allow(request).to receive(:scopes).and_return(
|
28
|
+
Doorkeeper::OAuth::Scopes.from_string 'invalid')
|
28
29
|
expect(subject).not_to be_valid
|
29
30
|
end
|
30
31
|
|
@@ -34,7 +35,7 @@ class Doorkeeper::OAuth::ClientCredentialsRequest
|
|
34
35
|
server_scopes = Doorkeeper::OAuth::Scopes.from_string 'email app'
|
35
36
|
allow(application).to receive(:scopes).and_return(application_scopes)
|
36
37
|
allow(server).to receive(:scopes).and_return(server_scopes)
|
37
|
-
allow(request).to receive(:
|
38
|
+
allow(request).to receive(:scopes).and_return(application_scopes)
|
38
39
|
expect(subject).to be_valid
|
39
40
|
end
|
40
41
|
|
@@ -43,7 +44,8 @@ class Doorkeeper::OAuth::ClientCredentialsRequest
|
|
43
44
|
server_scopes = Doorkeeper::OAuth::Scopes.from_string 'email app'
|
44
45
|
allow(application).to receive(:scopes).and_return(application_scopes)
|
45
46
|
allow(server).to receive(:scopes).and_return(server_scopes)
|
46
|
-
allow(request).to receive(:
|
47
|
+
allow(request).to receive(:scopes).and_return(
|
48
|
+
Doorkeeper::OAuth::Scopes.from_string 'email')
|
47
49
|
expect(subject).not_to be_valid
|
48
50
|
end
|
49
51
|
end
|
@@ -5,8 +5,14 @@ require 'doorkeeper/oauth/client_credentials_request'
|
|
5
5
|
|
6
6
|
module Doorkeeper::OAuth
|
7
7
|
describe ClientCredentialsRequest do
|
8
|
-
let(:server)
|
9
|
-
|
8
|
+
let(:server) do
|
9
|
+
double(
|
10
|
+
default_scopes: nil,
|
11
|
+
custom_access_token_expires_in: ->(_app) { nil }
|
12
|
+
)
|
13
|
+
end
|
14
|
+
let(:application) { double :application, scopes: Scopes.from_string('') }
|
15
|
+
let(:client) { double :client, application: application }
|
10
16
|
let(:token_creator) { double :issuer, create: true, token: double }
|
11
17
|
|
12
18
|
subject { ClientCredentialsRequest.new(server, client) }
|
@@ -60,5 +66,39 @@ module Doorkeeper::OAuth
|
|
60
66
|
subject.authorize
|
61
67
|
end
|
62
68
|
end
|
69
|
+
|
70
|
+
context 'with restricted client' do
|
71
|
+
let(:default_scopes) do
|
72
|
+
Doorkeeper::OAuth::Scopes.from_string('public email')
|
73
|
+
end
|
74
|
+
let(:server_scopes) do
|
75
|
+
Doorkeeper::OAuth::Scopes.from_string('public email phone')
|
76
|
+
end
|
77
|
+
let(:client_scopes) do
|
78
|
+
Doorkeeper::OAuth::Scopes.from_string('public phone')
|
79
|
+
end
|
80
|
+
|
81
|
+
before do
|
82
|
+
allow(server).to receive(:default_scopes).and_return(default_scopes)
|
83
|
+
allow(server).to receive(:scopes).and_return(server_scopes)
|
84
|
+
allow(server).to receive(:access_token_expires_in).and_return(100)
|
85
|
+
allow(application).to receive(:scopes).and_return(client_scopes)
|
86
|
+
allow(client).to receive(:id).and_return(nil)
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'delegates the error to issuer if no scope was requested' do
|
90
|
+
subject = ClientCredentialsRequest.new(server, client)
|
91
|
+
subject.authorize
|
92
|
+
expect(subject.response).to be_a(Doorkeeper::OAuth::ErrorResponse)
|
93
|
+
expect(subject.error).to eq(:invalid_scope)
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'issues an access token with requested scopes' do
|
97
|
+
subject = ClientCredentialsRequest.new(server, client, scope: 'phone')
|
98
|
+
subject.authorize
|
99
|
+
expect(subject.response).to be_a(Doorkeeper::OAuth::TokenResponse)
|
100
|
+
expect(subject.response.token.scopes_string).to eq('phone')
|
101
|
+
end
|
102
|
+
end
|
63
103
|
end
|
64
104
|
end
|
@@ -82,6 +82,21 @@ module Doorkeeper::OAuth
|
|
82
82
|
subject.validate
|
83
83
|
expect(subject.error).to eq(:invalid_scope)
|
84
84
|
end
|
85
|
+
|
86
|
+
it 'uses params[:scope] in favor of scopes if present (valid)' do
|
87
|
+
parameters[:scopes] = 'public update'
|
88
|
+
parameters[:scope] = 'public'
|
89
|
+
subject.authorize
|
90
|
+
expect(Doorkeeper::AccessToken.last.scopes).to eq([:public])
|
91
|
+
end
|
92
|
+
|
93
|
+
it 'uses params[:scope] in favor of scopes if present (invalid)' do
|
94
|
+
parameters[:scopes] = 'public'
|
95
|
+
parameters[:scope] = 'public update'
|
96
|
+
|
97
|
+
subject.validate
|
98
|
+
expect(subject.error).to eq(:invalid_scope)
|
99
|
+
end
|
85
100
|
end
|
86
101
|
|
87
102
|
end
|
@@ -2,8 +2,6 @@ require 'spec_helper_integration'
|
|
2
2
|
|
3
3
|
module Doorkeeper
|
4
4
|
describe Application do
|
5
|
-
include OrmHelper
|
6
|
-
|
7
5
|
let(:require_owner) { Doorkeeper.configuration.instance_variable_set('@confirm_application_owner', true) }
|
8
6
|
let(:unset_require_owner) { Doorkeeper.configuration.instance_variable_set('@confirm_application_owner', false) }
|
9
7
|
let(:new_application) { FactoryGirl.build(:application) }
|
@@ -32,7 +30,7 @@ module Doorkeeper
|
|
32
30
|
context 'application owner is required' do
|
33
31
|
before(:each) do
|
34
32
|
require_owner
|
35
|
-
@owner =
|
33
|
+
@owner = FactoryGirl.build_stubbed(:user)
|
36
34
|
end
|
37
35
|
|
38
36
|
it 'is invalid without an owner' do
|
@@ -40,19 +40,31 @@ feature 'Private API' do
|
|
40
40
|
expect(page.body).to have_content('index')
|
41
41
|
end
|
42
42
|
|
43
|
-
scenario 'access token with no scopes' do
|
44
|
-
optional_scopes_exist :admin
|
43
|
+
scenario 'access token with no allowed scopes' do
|
45
44
|
@token.update_attribute :scopes, nil
|
46
45
|
with_access_token_header @token.token
|
47
46
|
visit '/full_protected_resources/1.json'
|
48
47
|
response_status_should_be 403
|
49
48
|
end
|
50
49
|
|
51
|
-
scenario 'access token with
|
52
|
-
default_scopes_exist :admin
|
50
|
+
scenario 'access token with one of allowed scopes' do
|
53
51
|
@token.update_attribute :scopes, 'admin'
|
54
52
|
with_access_token_header @token.token
|
55
53
|
visit '/full_protected_resources/1.json'
|
56
54
|
expect(page.body).to have_content('show')
|
57
55
|
end
|
56
|
+
|
57
|
+
scenario 'access token with another of allowed scopes' do
|
58
|
+
@token.update_attribute :scopes, 'write'
|
59
|
+
with_access_token_header @token.token
|
60
|
+
visit '/full_protected_resources/1.json'
|
61
|
+
expect(page.body).to have_content('show')
|
62
|
+
end
|
63
|
+
|
64
|
+
scenario 'access token with both allowed scopes' do
|
65
|
+
@token.update_attribute :scopes, 'write admin'
|
66
|
+
with_access_token_header @token.token
|
67
|
+
visit '/full_protected_resources/1.json'
|
68
|
+
expect(page.body).to have_content('show')
|
69
|
+
end
|
58
70
|
end
|
@@ -8,18 +8,3 @@ RSpec.configure do |config|
|
|
8
8
|
Doorkeeper::AccessToken.create_indexes
|
9
9
|
end
|
10
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
|
-
end
|
19
|
-
|
20
|
-
module OrmHelper
|
21
|
-
def mock_application_owner
|
22
|
-
PlaceholderApplicationOwner.new
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
data/spec/support/orm/mongoid.rb
CHANGED
@@ -8,23 +8,3 @@ RSpec.configure do |config|
|
|
8
8
|
Doorkeeper::AccessToken.create_indexes
|
9
9
|
end
|
10
10
|
end
|
11
|
-
|
12
|
-
module Doorkeeper
|
13
|
-
class PlaceholderApplicationOwner
|
14
|
-
include Mongoid::Document
|
15
|
-
|
16
|
-
if ::Mongoid::VERSION >= '3'
|
17
|
-
self.store_in collection: :placeholder_application_owners
|
18
|
-
else
|
19
|
-
self.store_in :placeholder_application_owners
|
20
|
-
end
|
21
|
-
|
22
|
-
has_many :applications
|
23
|
-
end
|
24
|
-
|
25
|
-
module OrmHelper
|
26
|
-
def mock_application_owner
|
27
|
-
PlaceholderApplicationOwner.new
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: doorkeeper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.1.
|
4
|
+
version: 2.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Felipe Elias Philipp
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-03-
|
12
|
+
date: 2015-03-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: railties
|
@@ -220,6 +220,8 @@ files:
|
|
220
220
|
- lib/doorkeeper/errors.rb
|
221
221
|
- lib/doorkeeper/generators/doorkeeper/mongo_mapper/indexes_generator.rb
|
222
222
|
- lib/doorkeeper/generators/doorkeeper/mongo_mapper/templates/indexes.rb
|
223
|
+
- lib/doorkeeper/grape/authorization_decorator.rb
|
224
|
+
- lib/doorkeeper/grape/helpers.rb
|
223
225
|
- lib/doorkeeper/helpers/controller.rb
|
224
226
|
- lib/doorkeeper/models/access_grant_mixin.rb
|
225
227
|
- lib/doorkeeper/models/access_token_mixin.rb
|
@@ -444,7 +446,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
444
446
|
version: '0'
|
445
447
|
requirements: []
|
446
448
|
rubyforge_project:
|
447
|
-
rubygems_version: 2.4.
|
449
|
+
rubygems_version: 2.4.6
|
448
450
|
signing_key:
|
449
451
|
specification_version: 4
|
450
452
|
summary: Doorkeeper is an OAuth 2 provider for Rails.
|