grape_oauth2 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +11 -11
- data/Gemfile +23 -23
- data/Rakefile +11 -11
- data/grape_oauth2.gemspec +26 -27
- data/lib/grape_oauth2.rb +129 -129
- data/lib/grape_oauth2/configuration.rb +143 -143
- data/lib/grape_oauth2/configuration/class_accessors.rb +36 -36
- data/lib/grape_oauth2/configuration/validation.rb +71 -71
- data/lib/grape_oauth2/endpoints/authorize.rb +34 -34
- data/lib/grape_oauth2/endpoints/token.rb +72 -72
- data/lib/grape_oauth2/gem_version.rb +24 -24
- data/lib/grape_oauth2/generators/authorization.rb +44 -44
- data/lib/grape_oauth2/generators/base.rb +26 -26
- data/lib/grape_oauth2/generators/token.rb +62 -62
- data/lib/grape_oauth2/helpers/access_token_helpers.rb +52 -54
- data/lib/grape_oauth2/helpers/oauth_params.rb +41 -41
- data/lib/grape_oauth2/mixins/active_record/access_grant.rb +47 -47
- data/lib/grape_oauth2/mixins/active_record/access_token.rb +75 -75
- data/lib/grape_oauth2/mixins/active_record/client.rb +36 -35
- data/lib/grape_oauth2/mixins/mongoid/access_grant.rb +58 -58
- data/lib/grape_oauth2/mixins/mongoid/access_token.rb +88 -88
- data/lib/grape_oauth2/mixins/mongoid/client.rb +44 -41
- data/lib/grape_oauth2/mixins/sequel/access_grant.rb +68 -68
- data/lib/grape_oauth2/mixins/sequel/access_token.rb +86 -86
- data/lib/grape_oauth2/mixins/sequel/client.rb +54 -46
- data/lib/grape_oauth2/responses/authorization.rb +11 -10
- data/lib/grape_oauth2/responses/base.rb +56 -56
- data/lib/grape_oauth2/responses/token.rb +10 -10
- data/lib/grape_oauth2/scopes.rb +74 -74
- data/lib/grape_oauth2/strategies/authorization_code.rb +38 -38
- data/lib/grape_oauth2/strategies/base.rb +47 -47
- data/lib/grape_oauth2/strategies/client_credentials.rb +20 -20
- data/lib/grape_oauth2/strategies/password.rb +22 -22
- data/lib/grape_oauth2/strategies/refresh_token.rb +47 -47
- data/lib/grape_oauth2/unique_token.rb +20 -20
- data/lib/grape_oauth2/version.rb +14 -14
- data/spec/configuration/config_spec.rb +231 -231
- data/spec/configuration/version_spec.rb +12 -12
- data/spec/dummy/endpoints/custom_authorization.rb +25 -25
- data/spec/dummy/endpoints/custom_token.rb +35 -35
- data/spec/dummy/endpoints/status.rb +25 -25
- data/spec/dummy/grape_oauth2_config.rb +11 -11
- data/spec/dummy/orm/active_record/app/config/db.rb +7 -7
- data/spec/dummy/orm/active_record/app/models/access_code.rb +3 -3
- data/spec/dummy/orm/active_record/app/models/access_token.rb +3 -3
- data/spec/dummy/orm/active_record/app/models/application.rb +3 -3
- data/spec/dummy/orm/active_record/app/models/application_record.rb +3 -3
- data/spec/dummy/orm/active_record/app/models/user.rb +10 -10
- data/spec/dummy/orm/active_record/app/twitter.rb +36 -36
- data/spec/dummy/orm/active_record/config.ru +7 -7
- data/spec/dummy/orm/active_record/db/schema.rb +53 -53
- data/spec/dummy/orm/mongoid/app/config/db.rb +6 -6
- data/spec/dummy/orm/mongoid/app/config/mongoid.yml +21 -21
- data/spec/dummy/orm/mongoid/app/models/access_code.rb +3 -3
- data/spec/dummy/orm/mongoid/app/models/access_token.rb +3 -3
- data/spec/dummy/orm/mongoid/app/models/application.rb +3 -3
- data/spec/dummy/orm/mongoid/app/models/user.rb +11 -11
- data/spec/dummy/orm/mongoid/app/twitter.rb +34 -34
- data/spec/dummy/orm/mongoid/config.ru +5 -5
- data/spec/dummy/orm/sequel/app/config/db.rb +1 -1
- data/spec/dummy/orm/sequel/app/models/access_code.rb +4 -4
- data/spec/dummy/orm/sequel/app/models/access_token.rb +4 -4
- data/spec/dummy/orm/sequel/app/models/application.rb +4 -4
- data/spec/dummy/orm/sequel/app/models/application_record.rb +2 -2
- data/spec/dummy/orm/sequel/app/models/user.rb +11 -11
- data/spec/dummy/orm/sequel/app/twitter.rb +47 -47
- data/spec/dummy/orm/sequel/config.ru +5 -5
- data/spec/dummy/orm/sequel/db/schema.rb +50 -50
- data/spec/lib/scopes_spec.rb +50 -50
- data/spec/mixins/active_record/access_token_spec.rb +185 -185
- data/spec/mixins/active_record/client_spec.rb +104 -95
- data/spec/mixins/mongoid/access_token_spec.rb +185 -185
- data/spec/mixins/mongoid/client_spec.rb +104 -95
- data/spec/mixins/sequel/access_token_spec.rb +185 -185
- data/spec/mixins/sequel/client_spec.rb +105 -96
- data/spec/requests/flows/authorization_code_spec.rb +67 -67
- data/spec/requests/flows/client_credentials_spec.rb +101 -101
- data/spec/requests/flows/password_spec.rb +210 -210
- data/spec/requests/flows/refresh_token_spec.rb +222 -222
- data/spec/requests/flows/revoke_token_spec.rb +103 -103
- data/spec/requests/protected_resources_spec.rb +64 -64
- data/spec/spec_helper.rb +60 -60
- data/spec/support/api_helper.rb +11 -11
- metadata +50 -52
- data/.rspec +0 -2
- data/.rubocop.yml +0 -18
- data/.travis.yml +0 -42
- data/README.md +0 -820
- data/gemfiles/active_record.rb +0 -25
- data/gemfiles/mongoid.rb +0 -14
- data/gemfiles/sequel.rb +0 -24
- data/grape_oauth2.png +0 -0
@@ -1,41 +1,44 @@
|
|
1
|
-
module Grape
|
2
|
-
module OAuth2
|
3
|
-
module Mongoid
|
4
|
-
# Grape::OAuth2 Client role mixin for Mongoid ORM.
|
5
|
-
# Includes all the required API, associations, validations and callbacks.
|
6
|
-
module Client
|
7
|
-
extend ActiveSupport::Concern
|
8
|
-
|
9
|
-
included do
|
10
|
-
include ::Mongoid::Document
|
11
|
-
include ::Mongoid::Timestamps
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
field :
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
end
|
1
|
+
module Grape
|
2
|
+
module OAuth2
|
3
|
+
module Mongoid
|
4
|
+
# Grape::OAuth2 Client role mixin for Mongoid ORM.
|
5
|
+
# Includes all the required API, associations, validations and callbacks.
|
6
|
+
module Client
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
included do
|
10
|
+
include ::Mongoid::Document
|
11
|
+
include ::Mongoid::Timestamps
|
12
|
+
|
13
|
+
has_many :access_tokens, class_name: Grape::OAuth2.config.access_token_class_name,
|
14
|
+
foreign_key: :client_id, dependent: :delete
|
15
|
+
|
16
|
+
field :name, type: String
|
17
|
+
field :key, type: String
|
18
|
+
field :secret, type: String
|
19
|
+
field :redirect_uri, type: String
|
20
|
+
|
21
|
+
before_validation :generate_keys, on: :create
|
22
|
+
|
23
|
+
validates :key, :secret, presence: true
|
24
|
+
validates :key, uniqueness: true
|
25
|
+
|
26
|
+
def self.authenticate(key, secret = nil)
|
27
|
+
if secret.nil?
|
28
|
+
find_by(key: key)
|
29
|
+
else
|
30
|
+
find_by(key: key, secret: secret)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
protected
|
35
|
+
|
36
|
+
def generate_keys
|
37
|
+
self.key = Grape::OAuth2::UniqueToken.generate if key.blank?
|
38
|
+
self.secret = Grape::OAuth2::UniqueToken.generate if secret.blank?
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -1,68 +1,68 @@
|
|
1
|
-
module Grape
|
2
|
-
module OAuth2
|
3
|
-
module Sequel
|
4
|
-
# Grape::OAuth2 Authorization Grant role mixin for Sequel toolkit.
|
5
|
-
# Includes all the required API, associations, validations and callbacks.
|
6
|
-
module AccessGrant
|
7
|
-
extend ActiveSupport::Concern
|
8
|
-
|
9
|
-
included do
|
10
|
-
plugin :validation_helpers
|
11
|
-
plugin :timestamps
|
12
|
-
|
13
|
-
many_to_one :client, class: Grape::OAuth2.config.client_class_name, key: :client_id
|
14
|
-
many_to_one :resource_owner, class: Grape::OAuth2.config.resource_owner_class_name, key: :resource_owner_id
|
15
|
-
|
16
|
-
def before_validation
|
17
|
-
if new?
|
18
|
-
generate_token
|
19
|
-
setup_expiration
|
20
|
-
end
|
21
|
-
|
22
|
-
super
|
23
|
-
end
|
24
|
-
|
25
|
-
class << self
|
26
|
-
def create_for(client, resource_owner, redirect_uri, scopes = nil)
|
27
|
-
create(
|
28
|
-
client_id: client.id,
|
29
|
-
resource_owner_id: resource_owner && resource_owner.id,
|
30
|
-
redirect_uri: redirect_uri,
|
31
|
-
scopes: scopes.to_s
|
32
|
-
)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def validate
|
37
|
-
super
|
38
|
-
validates_presence [
|
39
|
-
validates_unique [:token]
|
40
|
-
end
|
41
|
-
|
42
|
-
def expired?
|
43
|
-
expires_at && Time.now.utc > expires_at
|
44
|
-
end
|
45
|
-
|
46
|
-
def revoked?
|
47
|
-
revoked_at && revoked_at <= Time.now.utc
|
48
|
-
end
|
49
|
-
|
50
|
-
def revoke!(revoked_at = Time.now)
|
51
|
-
set(revoked_at: revoked_at.utc)
|
52
|
-
save(columns: [:revoked_at], validate: false)
|
53
|
-
end
|
54
|
-
|
55
|
-
protected
|
56
|
-
|
57
|
-
def generate_token
|
58
|
-
self.token = Grape::OAuth2.config.token_generator.generate(values)
|
59
|
-
end
|
60
|
-
|
61
|
-
def setup_expiration
|
62
|
-
self.expires_at = Time.now.utc + Grape::OAuth2.config.authorization_code_lifetime if expires_at.nil?
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
1
|
+
module Grape
|
2
|
+
module OAuth2
|
3
|
+
module Sequel
|
4
|
+
# Grape::OAuth2 Authorization Grant role mixin for Sequel toolkit.
|
5
|
+
# Includes all the required API, associations, validations and callbacks.
|
6
|
+
module AccessGrant
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
included do
|
10
|
+
plugin :validation_helpers
|
11
|
+
plugin :timestamps
|
12
|
+
|
13
|
+
many_to_one :client, class: Grape::OAuth2.config.client_class_name, key: :client_id
|
14
|
+
many_to_one :resource_owner, class: Grape::OAuth2.config.resource_owner_class_name, key: :resource_owner_id
|
15
|
+
|
16
|
+
def before_validation
|
17
|
+
if new?
|
18
|
+
generate_token
|
19
|
+
setup_expiration
|
20
|
+
end
|
21
|
+
|
22
|
+
super
|
23
|
+
end
|
24
|
+
|
25
|
+
class << self
|
26
|
+
def create_for(client, resource_owner, redirect_uri, scopes = nil)
|
27
|
+
create(
|
28
|
+
client_id: client.id,
|
29
|
+
resource_owner_id: resource_owner && resource_owner.id,
|
30
|
+
redirect_uri: redirect_uri,
|
31
|
+
scopes: scopes.to_s
|
32
|
+
)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def validate
|
37
|
+
super
|
38
|
+
validates_presence %i[token client_id]
|
39
|
+
validates_unique [:token]
|
40
|
+
end
|
41
|
+
|
42
|
+
def expired?
|
43
|
+
expires_at && Time.now.utc > expires_at
|
44
|
+
end
|
45
|
+
|
46
|
+
def revoked?
|
47
|
+
revoked_at && revoked_at <= Time.now.utc
|
48
|
+
end
|
49
|
+
|
50
|
+
def revoke!(revoked_at = Time.now)
|
51
|
+
set(revoked_at: revoked_at.utc)
|
52
|
+
save(columns: [:revoked_at], validate: false)
|
53
|
+
end
|
54
|
+
|
55
|
+
protected
|
56
|
+
|
57
|
+
def generate_token
|
58
|
+
self.token = Grape::OAuth2.config.token_generator.generate(values)
|
59
|
+
end
|
60
|
+
|
61
|
+
def setup_expiration
|
62
|
+
self.expires_at = Time.now.utc + Grape::OAuth2.config.authorization_code_lifetime if expires_at.nil?
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -1,86 +1,86 @@
|
|
1
|
-
module Grape
|
2
|
-
module OAuth2
|
3
|
-
module Sequel
|
4
|
-
# Grape::OAuth2 Access Token role mixin for Sequel toolkit.
|
5
|
-
# Includes all the required API, associations, validations and callbacks.
|
6
|
-
module AccessToken
|
7
|
-
extend ActiveSupport::Concern
|
8
|
-
|
9
|
-
included do
|
10
|
-
plugin :validation_helpers
|
11
|
-
plugin :timestamps
|
12
|
-
|
13
|
-
many_to_one :client, class: Grape::OAuth2.config.client_class_name, key: :client_id
|
14
|
-
many_to_one :resource_owner, class: Grape::OAuth2.config.resource_owner_class_name, key: :resource_owner_id
|
15
|
-
|
16
|
-
def before_validation
|
17
|
-
if new?
|
18
|
-
setup_expiration
|
19
|
-
generate_tokens
|
20
|
-
end
|
21
|
-
|
22
|
-
super
|
23
|
-
end
|
24
|
-
|
25
|
-
def validate
|
26
|
-
super
|
27
|
-
validates_presence :token
|
28
|
-
validates_unique :token
|
29
|
-
end
|
30
|
-
|
31
|
-
class << self
|
32
|
-
def create_for(client, resource_owner, scopes = nil)
|
33
|
-
create(
|
34
|
-
client: client,
|
35
|
-
resource_owner: resource_owner,
|
36
|
-
scopes: scopes.to_s
|
37
|
-
)
|
38
|
-
end
|
39
|
-
|
40
|
-
def authenticate(token, type: :access_token)
|
41
|
-
if type && type.to_sym == :refresh_token
|
42
|
-
first(refresh_token: token.to_s)
|
43
|
-
else
|
44
|
-
first(token: token.to_s)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
def expired?
|
50
|
-
!expires_at.nil? && Time.now.utc > expires_at.utc
|
51
|
-
end
|
52
|
-
|
53
|
-
def revoked?
|
54
|
-
!revoked_at.nil? && revoked_at <= Time.now.utc
|
55
|
-
end
|
56
|
-
|
57
|
-
def revoke!(revoked_at = Time.now)
|
58
|
-
set(revoked_at: revoked_at.utc)
|
59
|
-
save(columns: [:revoked_at], validate: false)
|
60
|
-
end
|
61
|
-
|
62
|
-
def to_bearer_token
|
63
|
-
{
|
64
|
-
access_token: token,
|
65
|
-
expires_in: expires_at && Grape::OAuth2.config.access_token_lifetime.to_i,
|
66
|
-
refresh_token: refresh_token,
|
67
|
-
scope: scopes
|
68
|
-
}
|
69
|
-
end
|
70
|
-
|
71
|
-
protected
|
72
|
-
|
73
|
-
def generate_tokens
|
74
|
-
self.token = Grape::OAuth2.config.token_generator.generate(values) if token.blank?
|
75
|
-
self.refresh_token = Grape::OAuth2::UniqueToken.generate if Grape::OAuth2.config.issue_refresh_token
|
76
|
-
end
|
77
|
-
|
78
|
-
def setup_expiration
|
79
|
-
expires_in = Grape::OAuth2.config.access_token_lifetime
|
80
|
-
self.expires_at = Time.now + expires_in if expires_at.nil? && !expires_in.nil?
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
1
|
+
module Grape
|
2
|
+
module OAuth2
|
3
|
+
module Sequel
|
4
|
+
# Grape::OAuth2 Access Token role mixin for Sequel toolkit.
|
5
|
+
# Includes all the required API, associations, validations and callbacks.
|
6
|
+
module AccessToken
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
included do
|
10
|
+
plugin :validation_helpers
|
11
|
+
plugin :timestamps
|
12
|
+
|
13
|
+
many_to_one :client, class: Grape::OAuth2.config.client_class_name, key: :client_id
|
14
|
+
many_to_one :resource_owner, class: Grape::OAuth2.config.resource_owner_class_name, key: :resource_owner_id
|
15
|
+
|
16
|
+
def before_validation
|
17
|
+
if new?
|
18
|
+
setup_expiration
|
19
|
+
generate_tokens
|
20
|
+
end
|
21
|
+
|
22
|
+
super
|
23
|
+
end
|
24
|
+
|
25
|
+
def validate
|
26
|
+
super
|
27
|
+
validates_presence :token
|
28
|
+
validates_unique :token
|
29
|
+
end
|
30
|
+
|
31
|
+
class << self
|
32
|
+
def create_for(client, resource_owner, scopes = nil)
|
33
|
+
create(
|
34
|
+
client: client,
|
35
|
+
resource_owner: resource_owner,
|
36
|
+
scopes: scopes.to_s
|
37
|
+
)
|
38
|
+
end
|
39
|
+
|
40
|
+
def authenticate(token, type: :access_token)
|
41
|
+
if type && type.to_sym == :refresh_token
|
42
|
+
first(refresh_token: token.to_s)
|
43
|
+
else
|
44
|
+
first(token: token.to_s)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def expired?
|
50
|
+
!expires_at.nil? && Time.now.utc > expires_at.utc
|
51
|
+
end
|
52
|
+
|
53
|
+
def revoked?
|
54
|
+
!revoked_at.nil? && revoked_at <= Time.now.utc
|
55
|
+
end
|
56
|
+
|
57
|
+
def revoke!(revoked_at = Time.now)
|
58
|
+
set(revoked_at: revoked_at.utc)
|
59
|
+
save(columns: [:revoked_at], validate: false)
|
60
|
+
end
|
61
|
+
|
62
|
+
def to_bearer_token
|
63
|
+
{
|
64
|
+
access_token: token,
|
65
|
+
expires_in: expires_at && Grape::OAuth2.config.access_token_lifetime.to_i,
|
66
|
+
refresh_token: refresh_token,
|
67
|
+
scope: scopes
|
68
|
+
}
|
69
|
+
end
|
70
|
+
|
71
|
+
protected
|
72
|
+
|
73
|
+
def generate_tokens
|
74
|
+
self.token = Grape::OAuth2.config.token_generator.generate(values) if token.blank?
|
75
|
+
self.refresh_token = Grape::OAuth2::UniqueToken.generate if Grape::OAuth2.config.issue_refresh_token
|
76
|
+
end
|
77
|
+
|
78
|
+
def setup_expiration
|
79
|
+
expires_in = Grape::OAuth2.config.access_token_lifetime
|
80
|
+
self.expires_at = Time.now + expires_in if expires_at.nil? && !expires_in.nil?
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -1,46 +1,54 @@
|
|
1
|
-
module Grape
|
2
|
-
module OAuth2
|
3
|
-
module Sequel
|
4
|
-
# Grape::OAuth2 Client role mixin for Sequel toolkit.
|
5
|
-
# Includes all the required API, associations, validations and callbacks.
|
6
|
-
module Client
|
7
|
-
extend ActiveSupport::Concern
|
8
|
-
|
9
|
-
included do
|
10
|
-
plugin :validation_helpers
|
11
|
-
plugin :timestamps
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
end
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
1
|
+
module Grape
|
2
|
+
module OAuth2
|
3
|
+
module Sequel
|
4
|
+
# Grape::OAuth2 Client role mixin for Sequel toolkit.
|
5
|
+
# Includes all the required API, associations, validations and callbacks.
|
6
|
+
module Client
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
included do
|
10
|
+
plugin :validation_helpers
|
11
|
+
plugin :timestamps
|
12
|
+
plugin :association_dependencies
|
13
|
+
|
14
|
+
# Sequel 4.47 deprecated #set_allowed_columns
|
15
|
+
if (::Sequel::MAJOR >= 4 && ::Sequel::MINOR >= 47) || ::Sequel::MAJOR >= 5
|
16
|
+
plugin :whitelist_security
|
17
|
+
end
|
18
|
+
|
19
|
+
set_allowed_columns :name, :redirect_uri
|
20
|
+
|
21
|
+
one_to_many :access_tokens, class: Grape::OAuth2.config.access_token_class_name, key: :client_id
|
22
|
+
|
23
|
+
add_association_dependencies access_tokens: :delete
|
24
|
+
|
25
|
+
def before_validation
|
26
|
+
generate_keys if new?
|
27
|
+
super
|
28
|
+
end
|
29
|
+
|
30
|
+
def validate
|
31
|
+
super
|
32
|
+
validates_presence %i[key secret]
|
33
|
+
validates_unique :key
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.authenticate(key, secret = nil)
|
37
|
+
if secret.nil?
|
38
|
+
find(key: key)
|
39
|
+
else
|
40
|
+
find(key: key, secret: secret)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
protected
|
45
|
+
|
46
|
+
def generate_keys
|
47
|
+
self.key = Grape::OAuth2::UniqueToken.generate if key.blank?
|
48
|
+
self.secret = Grape::OAuth2::UniqueToken.generate if secret.blank?
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|