doorkeeper-device_authorization_grant 0.1.1 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5231c51f4fc5f93284e30b08cc6188e4ac43cfecfd1908110597350ddd0c2cf7
4
- data.tar.gz: 8cc73d6fe81263c383290e7c2b68a477b6cd0f4b6c9873d9efcdd4493fc1242b
3
+ metadata.gz: a95bd7a093b27e1735e590152c1eb72b0d24ddfe24769ef096bdfed7e5085fe7
4
+ data.tar.gz: 787d3736c5b2689191d505d67bd997c6ead61a6ca6f5c41233fde9c25d9cbc3e
5
5
  SHA512:
6
- metadata.gz: 8f67e3f89aad7ce4cfc2ac7d7c70d1dcb63b6129bb877592fe14e917c10cea626c5cabd3724fe427415215da4a965d81c042de7f615f861c76a32cb5a95272f1
7
- data.tar.gz: e4fefdce2c1662f05f48871c47927ddd46607de767652273e73c98120d4734cd2e1cb79c2ec045cd1536948d4584b475f57060124711ec0cffbb82bd81b69864
6
+ metadata.gz: aa55bc03f056f52064fd0defd3f8562508e62af6006cf28ba60cb1371a6f89ca1d5109f33a1d36639fdc8fdafecda7c6cf934a04c99ac169d158fc41318f7775
7
+ data.tar.gz: 335a27953d47a3ee17e6052510f9cfdd75cc55eaaacac1cd0e8b76b1eea8c09a4dbd573ba41ab4d68f0bda34da36a115a0dd2c7601e4640c1171b87e06ce8dc0
data/MIT-LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright 2020 EXOP Group
1
+ Copyright 2020-2021 EXOP Group
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -7,17 +7,6 @@ This library implements the OAuth 2.0 device authorization grant
7
7
  [Ruby on Rails](https://rubyonrails.org/) applications on top of the
8
8
  [Doorkeeper](https://github.com/doorkeeper-gem/doorkeeper) OAuth 2.0 framework.
9
9
 
10
- ## Status
11
-
12
- This extension currently works with Doorkeeper version `>= 5.4.0`.
13
-
14
- As of June 25 2020, due to some limitations of Doorkeeper, it is currently
15
- inconvenient for this Gem to use the official OAuth grant type
16
- `urn:ietf:params:oauth:grant-type:device_code`. Instead, it has been renamed
17
- to simply `device_code`, which is non-standard. This is going to be corrected
18
- soon: the next Doorkeeper release will include the ability to cleanly
19
- register custom Grant Flows - see [Doorkeeper Pull Request #1418](https://github.com/doorkeeper-gem/doorkeeper/pull/1418).
20
-
21
10
  ## Installation
22
11
 
23
12
  Add this line to your application's Gemfile:
@@ -55,7 +44,7 @@ $ rails doorkeeper_device_authorization_grant_engine:install:migrations
55
44
  ### Doorkeeper configuration
56
45
 
57
46
  In your Doorkeeper initializer (usually `config/initializers/doorkeeper.rb`), enable
58
- the device flow extension grant type, adding to the `grant_flows` option the `device_code`
47
+ the new grant flow extension, adding to the `grant_flows` option the `device_code`
59
48
  string. For example:
60
49
 
61
50
  ```ruby
@@ -65,9 +54,6 @@ string. For example:
65
54
  # ...
66
55
 
67
56
  grant_flows [
68
- # Note: this is a non-standard grant flow, used instead of the
69
- # official `urn:ietf:params:oauth:grant-type:device_code` due to
70
- # current Doorkeeper limitations.
71
57
  'device_code',
72
58
 
73
59
  # together with all the other grant flows you already enabled, for example:
@@ -80,11 +66,6 @@ string. For example:
80
66
  end
81
67
  ```
82
68
 
83
- Please note that **this is not the official grant flow**. The real one should be
84
- the IANA URN `urn:ietf:params:oauth:grant-type:device_code`, however this is hard
85
- to support with the current version of Doorkeeper, due to how strategy classes are
86
- looked up by grant type value.
87
-
88
69
  ### Device Authorization Grant configuration
89
70
 
90
71
  The gem's installation scripts automatically creates a new initializer file:
@@ -237,15 +218,11 @@ by Dorkeeper), for example:
237
218
  POST /oauth/token HTTP/1.1
238
219
  Content-Type: application/x-www-form-urlencoded
239
220
 
240
- grant_type=device_code
221
+ grant_type=urn:ietf:params:oauth:grant-type:device_code
241
222
  &device_code=GmRhmhcxhwAzkoEqiMEg_DnyEysNkuNhszIySk9eS
242
223
  &client_id=1406020730
243
224
  ```
244
225
 
245
- **Note:** this is a non-standard `grant_type`, used instead of the official
246
- `urn:ietf:params:oauth:grant-type:device_code` due to current limitations of
247
- the Doorkeeper gem.
248
-
249
226
  The response to this request is defined in the next section. It is expected for
250
227
  the *Device Client* to try the access token request repeatedly in a polling
251
228
  fashion, based on the error code in the response. The polling time interval
@@ -316,5 +293,12 @@ Content-Type: application/json
316
293
  The device authentication flow is now complete, and the token data can be used to
317
294
  authenticate requests against the authorization and/or resource server.
318
295
 
296
+ ## Example Application
297
+
298
+ Here you can find an example Rails application which uses this gem,
299
+ together with a little HTML/JS client to try out the device flow:
300
+
301
+ [https://github.com/exop-group/doorkeeper-device-flow-example](https://github.com/exop-group/doorkeeper-device-flow-example)
302
+
319
303
  ## License
320
304
  The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile CHANGED
@@ -1,20 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- begin
4
- require 'bundler/setup'
5
- rescue LoadError
6
- puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
7
- end
8
-
9
- require 'rdoc/task'
10
-
11
- RDoc::Task.new(:rdoc) do |rdoc|
12
- rdoc.rdoc_dir = 'rdoc'
13
- rdoc.title = 'Doorkeeper::DeviceAuthorizationGrant'
14
- rdoc.options << '--line-numbers'
15
- rdoc.rdoc_files.include('README.md')
16
- rdoc.rdoc_files.include('lib/**/*.rb')
17
- end
3
+ require 'bundler/setup'
18
4
 
19
5
  APP_RAKEFILE = File.expand_path('test/dummy/Rakefile', __dir__)
20
6
  load 'rails/tasks/engine.rake'
@@ -9,7 +9,7 @@ module Doorkeeper
9
9
  def create
10
10
  headers.merge!(authorize_response.headers)
11
11
  render(json: authorize_response.body, status: authorize_response.status)
12
- rescue Errors::DoorkeeperError => e
12
+ rescue Doorkeeper::Errors::DoorkeeperError => e
13
13
  handle_token_exception(e)
14
14
  end
15
15
 
@@ -1,4 +1,11 @@
1
1
  en:
2
+ activerecord:
3
+ errors:
4
+ models:
5
+ doorkeeper/device_authorization_grant/device_grant:
6
+ attributes:
7
+ scopes:
8
+ not_match_configured: "doesn't match configured on the server."
2
9
  doorkeeper:
3
10
  device_authorization_grant:
4
11
  device_authorizations:
@@ -5,11 +5,14 @@ require 'active_model'
5
5
  require 'doorkeeper/device_authorization_grant/config'
6
6
  require 'doorkeeper/device_authorization_grant/engine'
7
7
 
8
+ # Doorkeeper namespace
8
9
  module Doorkeeper
9
10
  # OAuth 2.0 Device Authorization Grant extension for Doorkeeper.
10
11
  module DeviceAuthorizationGrant
11
12
  autoload :DeviceGrant, 'doorkeeper/device_authorization_grant/orm/active_record/device_grant'
13
+ autoload :DeviceGrantMixin, 'doorkeeper/device_authorization_grant/orm/active_record/device_grant_mixin'
12
14
  autoload :Errors, 'doorkeeper/device_authorization_grant/errors'
15
+ autoload :OAuth, 'doorkeeper/device_authorization_grant/oauth'
13
16
  autoload :VERSION, 'doorkeeper/device_authorization_grant/version'
14
17
 
15
18
  # Namespace for device authorization request strategies
@@ -44,4 +47,10 @@ module Doorkeeper
44
47
  module Request
45
48
  autoload :DeviceCode, 'doorkeeper/request/device_code'
46
49
  end
50
+
51
+ Doorkeeper::GrantFlow.register(
52
+ :device_code,
53
+ grant_type_matches: Doorkeeper::DeviceAuthorizationGrant::OAuth::DEVICE_CODE,
54
+ grant_type_strategy: Doorkeeper::Request::DeviceCode
55
+ )
47
56
  end
@@ -18,8 +18,10 @@ module Doorkeeper
18
18
  # Error raised in case of missing configuration
19
19
  class MissingConfiguration < StandardError
20
20
  def initialize
21
- super('Configuration for Doorkeeper::DeviceAuthorizationGrant missing. ' \
22
- 'Do you have Doorkeeper::DeviceAuthorizationGrant initializer?')
21
+ super(
22
+ 'Configuration for Doorkeeper::DeviceAuthorizationGrant missing. ' \
23
+ 'Do you have Doorkeeper::DeviceAuthorizationGrant initializer?'
24
+ )
23
25
  end
24
26
  end
25
27
 
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Doorkeeper
4
+ module DeviceAuthorizationGrant
5
+ module OAuth
6
+ # IANA URN of the Device Authorization Grant Type.
7
+ # @see https://tools.ietf.org/html/rfc8628#section-7.2 RFC 8628 - 7.2. OAuth URI Registration
8
+ DEVICE_CODE = 'urn:ietf:params:oauth:grant-type:device_code'
9
+ public_constant :DEVICE_CODE
10
+ end
11
+ end
12
+ end
@@ -7,8 +7,8 @@ module Doorkeeper
7
7
  #
8
8
  # @see https://tools.ietf.org/html/rfc8628#section-3.1 RFC 8628, sect. 3.1
9
9
  class DeviceAuthorizationRequest < Doorkeeper::OAuth::BaseRequest
10
- attr_accessor :server
11
- attr_accessor :client
10
+ attr_accessor :server,
11
+ :client
12
12
 
13
13
  # @return [String]
14
14
  attr_accessor :host_name
@@ -18,10 +18,13 @@ module Doorkeeper
18
18
  # @param server
19
19
  # @param client
20
20
  # @param host_name [String]
21
- def initialize(server, client, host_name)
21
+ # @param parameters [Hash]
22
+ def initialize(server, client, host_name, parameters = {}) # rubocop:disable Style/OptionHash
23
+ super()
22
24
  @server = server
23
25
  @client = client
24
26
  @host_name = host_name
27
+ @original_scopes = parameters[:scope]
25
28
  end
26
29
 
27
30
  # @return [DeviceAuthorizationResponse, Doorkeeper::OAuth::ErrorResponse]
@@ -16,6 +16,7 @@ module Doorkeeper
16
16
  # @param device_grant [DeviceGrant]
17
17
  # @param host_name [String]
18
18
  def initialize(device_grant, host_name)
19
+ super()
19
20
  @device_grant = device_grant
20
21
  @host_name = host_name
21
22
  end
@@ -28,7 +29,7 @@ module Doorkeeper
28
29
  # @return [Hash]
29
30
  def body
30
31
  {
31
- 'device_code' => device_grant.device_code,
32
+ 'device_code' => device_grant.plaintext_device_code,
32
33
  'user_code' => device_grant.user_code,
33
34
  'verification_uri' => verification_uri,
34
35
  'verification_uri_complete' => verification_uri_complete,
@@ -7,14 +7,13 @@ module Doorkeeper
7
7
  #
8
8
  # @see https://tools.ietf.org/html/rfc8628#section-3.4 RFC 8628, sect. 3.4
9
9
  class DeviceCodeRequest < ::Doorkeeper::OAuth::BaseRequest
10
- attr_accessor :server
11
- attr_accessor :client
10
+ attr_accessor :server,
11
+ :client,
12
+ :access_token
12
13
 
13
14
  # @return [DeviceGrant]
14
15
  attr_accessor :device_grant
15
16
 
16
- attr_accessor :access_token
17
-
18
17
  validate :client, error: :invalid_client
19
18
  validate :device_grant, error: :invalid_grant
20
19
 
@@ -22,12 +21,13 @@ module Doorkeeper
22
21
  # @param client
23
22
  # @param device_grant [DeviceGrant]
24
23
  def initialize(server, client, device_grant)
24
+ super()
25
+
25
26
  @server = server
26
27
  @client = client
27
28
  @device_grant = device_grant
28
29
 
29
- # this should be `urn:ietf:params:oauth:grant-type:device_code`
30
- @grant_type = 'device_code'
30
+ @grant_type = Doorkeeper::DeviceAuthorizationGrant::OAuth::DEVICE_CODE
31
31
  end
32
32
 
33
33
  def before_successful_response
@@ -5,41 +5,7 @@ module Doorkeeper
5
5
  # Model class, similar to Doorkeeper `AccessGrant`, but specific for
6
6
  # handling OAuth 2.0 Device Authorization Grant.
7
7
  class DeviceGrant < ActiveRecord::Base
8
- self.table_name = "#{table_name_prefix}oauth_device_grants#{table_name_suffix}"
9
-
10
- include ::Doorkeeper::Models::Expirable
11
-
12
- delegate :secret_strategy, :fallback_secret_strategy, to: :class
13
-
14
- belongs_to :application, class_name: Doorkeeper.configuration.application_class, optional: true
15
-
16
- before_validation :generate_device_code, on: :create
17
-
18
- validates :application_id, presence: true
19
- validates :expires_in, presence: true
20
- validates :device_code, presence: true, uniqueness: true
21
-
22
- validates :user_code, presence: true, uniqueness: true, if: -> { resource_owner_id.blank? }
23
- validates :user_code, absence: true, if: -> { resource_owner_id.present? }
24
-
25
- validates :resource_owner_id, presence: true, if: -> { user_code.blank? }
26
- validates :resource_owner_id, absence: true, if: -> { user_code.present? }
27
-
28
- scope(
29
- :expired,
30
- lambda do
31
- exp_in = DeviceAuthorizationGrant.configuration.device_code_expires_in
32
- where('created_at <= :expiration_date', expiration_date: exp_in.seconds.ago)
33
- end
34
- )
35
-
36
- scope(
37
- :unexpired,
38
- lambda do
39
- exp_in = DeviceAuthorizationGrant.configuration.device_code_expires_in
40
- where('created_at > :expiration_date', expiration_date: exp_in.seconds.ago)
41
- end
42
- )
8
+ include DeviceGrantMixin
43
9
 
44
10
  # @!attribute application_id
45
11
  # @return [Integer]
@@ -64,87 +30,6 @@ module Doorkeeper
64
30
 
65
31
  # @!attribute last_polling_at
66
32
  # @return [Time, nil]
67
-
68
- class << self
69
- # Returns an instance of the DeviceGrant with specific device code
70
- # value.
71
- #
72
- # @param device_code [#to_s] device code value
73
- # @return [Doorkeeper::DeviceAuthorizationGrant::DeviceGrant, nil]
74
- # DeviceGrant object, or nil if there is no record with such code
75
- def find_by_plaintext_device_code(device_code)
76
- device_code = device_code.to_s
77
-
78
- find_by(device_code: secret_strategy.transform_secret(device_code)) ||
79
- find_by_fallback_device_code(device_code)
80
- end
81
-
82
- alias by_device_code find_by_plaintext_device_code
83
-
84
- # Allow looking up previously plain device codes as a fallback IFF a
85
- # fallback strategy has been defined
86
- #
87
- # @param plain_secret [#to_s] plain secret value
88
- # @return [Doorkeeper::DeviceAuthorizationGrant::DeviceGrant, nil]
89
- # DeviceGrant object or nil if there is no record with such code
90
- def find_by_fallback_device_code(plain_secret)
91
- return nil unless fallback_secret_strategy
92
-
93
- # Use the previous strategy to look up
94
- stored_code = fallback_secret_strategy.transform_secret(plain_secret)
95
- find_by(device_code: stored_code).tap do |resource|
96
- upgrade_fallback_value(resource, plain_secret) if resource
97
- end
98
- end
99
-
100
- # Allows to replace a plain value fallback, to avoid it remaining as
101
- # plain text.
102
- #
103
- # @param instance [Doorkeeper::DeviceAuthorizationGrant::DeviceGrant]
104
- # An instance of this model with a plain value device code.
105
- # @param plain_secret [String] The plain secret to upgrade.
106
- def upgrade_fallback_value(instance, plain_secret)
107
- upgraded =
108
- secret_strategy.store_secret(instance, :device_code, plain_secret)
109
- instance.update(device_code: upgraded)
110
- end
111
-
112
- # Determines the secret storing transformer
113
- # Unless configured otherwise, uses the plain secret strategy
114
- def secret_strategy
115
- ::Doorkeeper.configuration.token_secret_strategy
116
- end
117
-
118
- # Determine the fallback storing strategy
119
- # Unless configured, there will be no fallback
120
- def fallback_secret_strategy
121
- ::Doorkeeper.configuration.token_secret_fallback_strategy
122
- end
123
- end
124
-
125
- # We keep a volatile copy of the raw device code for initial
126
- # communication.
127
- #
128
- # Some strategies allow restoring stored secrets (e.g. symmetric
129
- # encryption) while hashing strategies do not, so you cannot rely on
130
- # this value returning a present value for persisted device codes.
131
- def plaintext_device_code
132
- if secret_strategy.allows_restoring_secrets?
133
- secret_strategy.restore_secret(self, :device_code)
134
- else
135
- @raw_device_code
136
- end
137
- end
138
-
139
- private
140
-
141
- # Generates a device code value with UniqueToken class.
142
- #
143
- # @return [String] device code value
144
- def generate_device_code
145
- @raw_device_code = Doorkeeper::OAuth::Helpers::UniqueToken.generate
146
- secret_strategy.store_secret(self, :device_code, @raw_device_code)
147
- end
148
33
  end
149
34
  end
150
35
  end
@@ -0,0 +1,146 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Doorkeeper
4
+ module DeviceAuthorizationGrant
5
+ # Module mixin for Device Grant models.
6
+ #
7
+ # This is similar to Doorkeeper `AccessGrantMixin`, but specific for handling
8
+ # OAuth 2.0 Device Authorization Grant.
9
+ module DeviceGrantMixin
10
+ extend ActiveSupport::Concern
11
+ include ::Doorkeeper::Models::Expirable
12
+
13
+ included do # rubocop:disable Metrics/BlockLength
14
+ self.table_name = "#{table_name_prefix}oauth_device_grants#{table_name_suffix}"
15
+
16
+ delegate :secret_strategy, :fallback_secret_strategy, to: :class
17
+
18
+ belongs_to :application, class_name: Doorkeeper.configuration.application_class, optional: true
19
+
20
+ before_validation :generate_device_code, on: :create
21
+
22
+ validates :application_id, presence: true
23
+ validates :expires_in, presence: true
24
+ validates :device_code, presence: true, uniqueness: true
25
+
26
+ validates :user_code, presence: true, uniqueness: true, if: -> { resource_owner_id.blank? }
27
+ validates :user_code, absence: true, if: -> { resource_owner_id.present? }
28
+
29
+ validates :resource_owner_id, presence: true, if: -> { user_code.blank? }
30
+ validates :resource_owner_id, absence: true, if: -> { user_code.present? }
31
+ validate :scopes_match_configured, if: :enforce_scopes?
32
+
33
+ scope(
34
+ :expired,
35
+ lambda do
36
+ exp_in = DeviceAuthorizationGrant.configuration.device_code_expires_in
37
+ where('created_at <= :expiration_date', expiration_date: exp_in.seconds.ago)
38
+ end
39
+ )
40
+
41
+ scope(
42
+ :unexpired,
43
+ lambda do
44
+ exp_in = DeviceAuthorizationGrant.configuration.device_code_expires_in
45
+ where('created_at > :expiration_date', expiration_date: exp_in.seconds.ago)
46
+ end
47
+ )
48
+ end
49
+
50
+ # ClassMethods
51
+ module ClassMethods
52
+ # Returns an instance of the DeviceGrant with specific device code
53
+ # value.
54
+ #
55
+ # @param device_code [#to_s] device code value
56
+ # @return [Doorkeeper::DeviceAuthorizationGrant::DeviceGrant, nil]
57
+ # DeviceGrant object, or nil if there is no record with such code
58
+ def find_by_plaintext_device_code(device_code)
59
+ device_code = device_code.to_s
60
+
61
+ find_by(device_code: secret_strategy.transform_secret(device_code)) ||
62
+ find_by_fallback_device_code(device_code)
63
+ end
64
+
65
+ alias by_device_code find_by_plaintext_device_code
66
+
67
+ # Allow looking up previously plain device codes as a fallback IFF a
68
+ # fallback strategy has been defined
69
+ #
70
+ # @param plain_secret [#to_s] plain secret value
71
+ # @return [Doorkeeper::DeviceAuthorizationGrant::DeviceGrant, nil]
72
+ # DeviceGrant object or nil if there is no record with such code
73
+ def find_by_fallback_device_code(plain_secret)
74
+ return nil unless fallback_secret_strategy
75
+
76
+ # Use the previous strategy to look up
77
+ stored_code = fallback_secret_strategy.transform_secret(plain_secret)
78
+ find_by(device_code: stored_code).tap do |resource|
79
+ upgrade_fallback_value(resource, plain_secret) if resource
80
+ end
81
+ end
82
+
83
+ # Allows to replace a plain value fallback, to avoid it remaining as
84
+ # plain text.
85
+ #
86
+ # @param instance [Doorkeeper::DeviceAuthorizationGrant::DeviceGrant]
87
+ # An instance of this model with a plain value device code.
88
+ # @param plain_secret [String] The plain secret to upgrade.
89
+ def upgrade_fallback_value(instance, plain_secret)
90
+ upgraded =
91
+ secret_strategy.store_secret(instance, :device_code, plain_secret)
92
+ instance.update(device_code: upgraded)
93
+ end
94
+
95
+ # Determines the secret storing transformer
96
+ # Unless configured otherwise, uses the plain secret strategy
97
+ def secret_strategy
98
+ ::Doorkeeper.configuration.token_secret_strategy
99
+ end
100
+
101
+ # Determine the fallback storing strategy
102
+ # Unless configured, there will be no fallback
103
+ def fallback_secret_strategy
104
+ ::Doorkeeper.configuration.token_secret_fallback_strategy
105
+ end
106
+ end
107
+
108
+ # We keep a volatile copy of the raw device code for initial
109
+ # communication.
110
+ #
111
+ # Some strategies allow restoring stored secrets (e.g. symmetric
112
+ # encryption) while hashing strategies do not, so you cannot rely on
113
+ # this value returning a present value for persisted device codes.
114
+ def plaintext_device_code
115
+ if secret_strategy.allows_restoring_secrets?
116
+ secret_strategy.restore_secret(self, :device_code)
117
+ else
118
+ @raw_device_code
119
+ end
120
+ end
121
+
122
+ private
123
+
124
+ # Generates a device code value with UniqueToken class.
125
+ #
126
+ # @return [String] device code value
127
+ def generate_device_code
128
+ @raw_device_code = Doorkeeper::OAuth::Helpers::UniqueToken.generate
129
+ secret_strategy.store_secret(self, :device_code, @raw_device_code)
130
+ end
131
+
132
+ def scopes_match_configured
133
+ if scopes.present? && !Doorkeeper::OAuth::Helpers::ScopeChecker.valid?(
134
+ scope_str: scopes.to_s,
135
+ server_scopes: Doorkeeper.config.scopes
136
+ )
137
+ errors.add(:scopes, :not_match_configured)
138
+ end
139
+ end
140
+
141
+ def enforce_scopes?
142
+ Doorkeeper.config.enforce_configured_scopes?
143
+ end
144
+ end
145
+ end
146
+ end
@@ -7,14 +7,15 @@ module Doorkeeper
7
7
  #
8
8
  # @see https://tools.ietf.org/html/rfc8628#section-3.1 RFC 8628, sect. 3.1
9
9
  class DeviceAuthorization < ::Doorkeeper::Request::Strategy
10
- delegate :client, to: :server
10
+ delegate :client, :parameters, to: :server
11
11
 
12
12
  # @return [OAuth::DeviceAuthorizationRequest]
13
13
  def request
14
14
  @request ||= OAuth::DeviceAuthorizationRequest.new(
15
15
  Doorkeeper.configuration,
16
16
  client,
17
- host_name
17
+ host_name,
18
+ parameters
18
19
  )
19
20
  end
20
21
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Doorkeeper
4
4
  module DeviceAuthorizationGrant
5
- VERSION = '0.1.1'
5
+ VERSION = '1.0.1'
6
6
  public_constant :VERSION
7
7
  end
8
8
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: doorkeeper-device_authorization_grant
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - EXOP Group
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-06-30 00:00:00.000000000 Z
11
+ date: 2021-08-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: doorkeeper
@@ -16,70 +16,90 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '5.4'
19
+ version: '5.5'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '5.4'
26
+ version: '5.5'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rubocop
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 0.86.0
33
+ version: '1.14'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 0.86.0
40
+ version: '1.14'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rubocop-rails
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '2.10'
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: 2.10.1
51
+ type: :development
52
+ prerelease: false
53
+ version_requirements: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - "~>"
56
+ - !ruby/object:Gem::Version
57
+ version: '2.10'
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: 2.10.1
41
61
  - !ruby/object:Gem::Dependency
42
62
  name: simplecov
43
63
  requirement: !ruby/object:Gem::Requirement
44
64
  requirements:
45
65
  - - "~>"
46
66
  - !ruby/object:Gem::Version
47
- version: 0.18.5
67
+ version: 0.21.2
48
68
  type: :development
49
69
  prerelease: false
50
70
  version_requirements: !ruby/object:Gem::Requirement
51
71
  requirements:
52
72
  - - "~>"
53
73
  - !ruby/object:Gem::Version
54
- version: 0.18.5
74
+ version: 0.21.2
55
75
  - !ruby/object:Gem::Dependency
56
76
  name: sqlite3
57
77
  requirement: !ruby/object:Gem::Requirement
58
78
  requirements:
59
79
  - - "~>"
60
80
  - !ruby/object:Gem::Version
61
- version: '1.3'
81
+ version: 1.4.2
62
82
  type: :development
63
83
  prerelease: false
64
84
  version_requirements: !ruby/object:Gem::Requirement
65
85
  requirements:
66
86
  - - "~>"
67
87
  - !ruby/object:Gem::Version
68
- version: '1.3'
88
+ version: 1.4.2
69
89
  - !ruby/object:Gem::Dependency
70
90
  name: yard
71
91
  requirement: !ruby/object:Gem::Requirement
72
92
  requirements:
73
93
  - - "~>"
74
94
  - !ruby/object:Gem::Version
75
- version: 0.9.25
95
+ version: 0.9.26
76
96
  type: :development
77
97
  prerelease: false
78
98
  version_requirements: !ruby/object:Gem::Requirement
79
99
  requirements:
80
100
  - - "~>"
81
101
  - !ruby/object:Gem::Version
82
- version: 0.9.25
102
+ version: 0.9.26
83
103
  description: OAuth 2.0 Device Authorization Grant extension for Doorkeeper.
84
104
  email:
85
105
  - opensource@exop-group.com
@@ -99,12 +119,14 @@ files:
99
119
  - lib/doorkeeper/device_authorization_grant/config.rb
100
120
  - lib/doorkeeper/device_authorization_grant/engine.rb
101
121
  - lib/doorkeeper/device_authorization_grant/errors.rb
122
+ - lib/doorkeeper/device_authorization_grant/oauth.rb
102
123
  - lib/doorkeeper/device_authorization_grant/oauth/device_authorization_request.rb
103
124
  - lib/doorkeeper/device_authorization_grant/oauth/device_authorization_response.rb
104
125
  - lib/doorkeeper/device_authorization_grant/oauth/device_code_request.rb
105
126
  - lib/doorkeeper/device_authorization_grant/oauth/helpers/user_code.rb
106
127
  - lib/doorkeeper/device_authorization_grant/orm/active_record.rb
107
128
  - lib/doorkeeper/device_authorization_grant/orm/active_record/device_grant.rb
129
+ - lib/doorkeeper/device_authorization_grant/orm/active_record/device_grant_mixin.rb
108
130
  - lib/doorkeeper/device_authorization_grant/rails/routes.rb
109
131
  - lib/doorkeeper/device_authorization_grant/rails/routes/mapper.rb
110
132
  - lib/doorkeeper/device_authorization_grant/rails/routes/mapping.rb
@@ -116,7 +138,10 @@ files:
116
138
  homepage: https://github.com/exop-group/doorkeeper-device_authorization_grant
117
139
  licenses:
118
140
  - MIT
119
- metadata: {}
141
+ metadata:
142
+ homepage_uri: https://github.com/exop-group/doorkeeper-device_authorization_grant
143
+ source_code_uri: https://github.com/exop-group/doorkeeper-device_authorization_grant
144
+ changelog_uri: https://github.com/exop-group/doorkeeper-device_authorization_grant/blob/master/CHANGELOG.md
120
145
  post_install_message:
121
146
  rdoc_options: []
122
147
  require_paths:
@@ -132,7 +157,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
132
157
  - !ruby/object:Gem::Version
133
158
  version: '0'
134
159
  requirements: []
135
- rubygems_version: 3.1.2
160
+ rubygems_version: 3.0.8
136
161
  signing_key:
137
162
  specification_version: 4
138
163
  summary: OAuth 2.0 Device Authorization Grant extension for Doorkeeper.