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.
Files changed (93) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +11 -11
  3. data/Gemfile +23 -23
  4. data/Rakefile +11 -11
  5. data/grape_oauth2.gemspec +26 -27
  6. data/lib/grape_oauth2.rb +129 -129
  7. data/lib/grape_oauth2/configuration.rb +143 -143
  8. data/lib/grape_oauth2/configuration/class_accessors.rb +36 -36
  9. data/lib/grape_oauth2/configuration/validation.rb +71 -71
  10. data/lib/grape_oauth2/endpoints/authorize.rb +34 -34
  11. data/lib/grape_oauth2/endpoints/token.rb +72 -72
  12. data/lib/grape_oauth2/gem_version.rb +24 -24
  13. data/lib/grape_oauth2/generators/authorization.rb +44 -44
  14. data/lib/grape_oauth2/generators/base.rb +26 -26
  15. data/lib/grape_oauth2/generators/token.rb +62 -62
  16. data/lib/grape_oauth2/helpers/access_token_helpers.rb +52 -54
  17. data/lib/grape_oauth2/helpers/oauth_params.rb +41 -41
  18. data/lib/grape_oauth2/mixins/active_record/access_grant.rb +47 -47
  19. data/lib/grape_oauth2/mixins/active_record/access_token.rb +75 -75
  20. data/lib/grape_oauth2/mixins/active_record/client.rb +36 -35
  21. data/lib/grape_oauth2/mixins/mongoid/access_grant.rb +58 -58
  22. data/lib/grape_oauth2/mixins/mongoid/access_token.rb +88 -88
  23. data/lib/grape_oauth2/mixins/mongoid/client.rb +44 -41
  24. data/lib/grape_oauth2/mixins/sequel/access_grant.rb +68 -68
  25. data/lib/grape_oauth2/mixins/sequel/access_token.rb +86 -86
  26. data/lib/grape_oauth2/mixins/sequel/client.rb +54 -46
  27. data/lib/grape_oauth2/responses/authorization.rb +11 -10
  28. data/lib/grape_oauth2/responses/base.rb +56 -56
  29. data/lib/grape_oauth2/responses/token.rb +10 -10
  30. data/lib/grape_oauth2/scopes.rb +74 -74
  31. data/lib/grape_oauth2/strategies/authorization_code.rb +38 -38
  32. data/lib/grape_oauth2/strategies/base.rb +47 -47
  33. data/lib/grape_oauth2/strategies/client_credentials.rb +20 -20
  34. data/lib/grape_oauth2/strategies/password.rb +22 -22
  35. data/lib/grape_oauth2/strategies/refresh_token.rb +47 -47
  36. data/lib/grape_oauth2/unique_token.rb +20 -20
  37. data/lib/grape_oauth2/version.rb +14 -14
  38. data/spec/configuration/config_spec.rb +231 -231
  39. data/spec/configuration/version_spec.rb +12 -12
  40. data/spec/dummy/endpoints/custom_authorization.rb +25 -25
  41. data/spec/dummy/endpoints/custom_token.rb +35 -35
  42. data/spec/dummy/endpoints/status.rb +25 -25
  43. data/spec/dummy/grape_oauth2_config.rb +11 -11
  44. data/spec/dummy/orm/active_record/app/config/db.rb +7 -7
  45. data/spec/dummy/orm/active_record/app/models/access_code.rb +3 -3
  46. data/spec/dummy/orm/active_record/app/models/access_token.rb +3 -3
  47. data/spec/dummy/orm/active_record/app/models/application.rb +3 -3
  48. data/spec/dummy/orm/active_record/app/models/application_record.rb +3 -3
  49. data/spec/dummy/orm/active_record/app/models/user.rb +10 -10
  50. data/spec/dummy/orm/active_record/app/twitter.rb +36 -36
  51. data/spec/dummy/orm/active_record/config.ru +7 -7
  52. data/spec/dummy/orm/active_record/db/schema.rb +53 -53
  53. data/spec/dummy/orm/mongoid/app/config/db.rb +6 -6
  54. data/spec/dummy/orm/mongoid/app/config/mongoid.yml +21 -21
  55. data/spec/dummy/orm/mongoid/app/models/access_code.rb +3 -3
  56. data/spec/dummy/orm/mongoid/app/models/access_token.rb +3 -3
  57. data/spec/dummy/orm/mongoid/app/models/application.rb +3 -3
  58. data/spec/dummy/orm/mongoid/app/models/user.rb +11 -11
  59. data/spec/dummy/orm/mongoid/app/twitter.rb +34 -34
  60. data/spec/dummy/orm/mongoid/config.ru +5 -5
  61. data/spec/dummy/orm/sequel/app/config/db.rb +1 -1
  62. data/spec/dummy/orm/sequel/app/models/access_code.rb +4 -4
  63. data/spec/dummy/orm/sequel/app/models/access_token.rb +4 -4
  64. data/spec/dummy/orm/sequel/app/models/application.rb +4 -4
  65. data/spec/dummy/orm/sequel/app/models/application_record.rb +2 -2
  66. data/spec/dummy/orm/sequel/app/models/user.rb +11 -11
  67. data/spec/dummy/orm/sequel/app/twitter.rb +47 -47
  68. data/spec/dummy/orm/sequel/config.ru +5 -5
  69. data/spec/dummy/orm/sequel/db/schema.rb +50 -50
  70. data/spec/lib/scopes_spec.rb +50 -50
  71. data/spec/mixins/active_record/access_token_spec.rb +185 -185
  72. data/spec/mixins/active_record/client_spec.rb +104 -95
  73. data/spec/mixins/mongoid/access_token_spec.rb +185 -185
  74. data/spec/mixins/mongoid/client_spec.rb +104 -95
  75. data/spec/mixins/sequel/access_token_spec.rb +185 -185
  76. data/spec/mixins/sequel/client_spec.rb +105 -96
  77. data/spec/requests/flows/authorization_code_spec.rb +67 -67
  78. data/spec/requests/flows/client_credentials_spec.rb +101 -101
  79. data/spec/requests/flows/password_spec.rb +210 -210
  80. data/spec/requests/flows/refresh_token_spec.rb +222 -222
  81. data/spec/requests/flows/revoke_token_spec.rb +103 -103
  82. data/spec/requests/protected_resources_spec.rb +64 -64
  83. data/spec/spec_helper.rb +60 -60
  84. data/spec/support/api_helper.rb +11 -11
  85. metadata +50 -52
  86. data/.rspec +0 -2
  87. data/.rubocop.yml +0 -18
  88. data/.travis.yml +0 -42
  89. data/README.md +0 -820
  90. data/gemfiles/active_record.rb +0 -25
  91. data/gemfiles/mongoid.rb +0 -14
  92. data/gemfiles/sequel.rb +0 -24
  93. 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
- field :name, type: String
14
- field :key, type: String
15
- field :secret, type: String
16
- field :redirect_uri, type: String
17
-
18
- before_validation :generate_keys, on: :create
19
-
20
- validates :key, :secret, presence: true
21
- validates :key, uniqueness: true
22
-
23
- def self.authenticate(key, secret = nil)
24
- if secret.nil?
25
- Application.find_by(key: key)
26
- else
27
- Application.find_by(key: key, secret: secret)
28
- end
29
- end
30
-
31
- protected
32
-
33
- def generate_keys
34
- self.key = Grape::OAuth2::UniqueToken.generate if key.blank?
35
- self.secret = Grape::OAuth2::UniqueToken.generate if secret.blank?
36
- end
37
- end
38
- end
39
- end
40
- end
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 [: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
+ 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
- set_allowed_columns :name, :redirect_uri
14
-
15
- one_to_many :access_tokens, class: Grape::OAuth2.config.access_token_class_name, key: :client_id
16
-
17
- def before_validation
18
- generate_keys if new?
19
- super
20
- end
21
-
22
- def validate
23
- super
24
- validates_presence [:key, :secret]
25
- validates_unique :key
26
- end
27
-
28
- def self.authenticate(key, secret = nil)
29
- if secret.nil?
30
- find(key: key)
31
- else
32
- find(key: key, secret: secret)
33
- end
34
- end
35
-
36
- protected
37
-
38
- def generate_keys
39
- self.key = Grape::OAuth2::UniqueToken.generate if key.blank?
40
- self.secret = Grape::OAuth2::UniqueToken.generate if secret.blank?
41
- end
42
- end
43
- end
44
- end
45
- end
46
- end
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