openid_connect 0.6.1 → 0.7.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 (34) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -1
  3. data/README.rdoc +3 -1
  4. data/VERSION +1 -1
  5. data/lib/openid_connect/access_token.rb +1 -2
  6. data/lib/openid_connect/client.rb +2 -6
  7. data/lib/openid_connect/client/registrar.rb +59 -123
  8. data/lib/openid_connect/discovery.rb +0 -2
  9. data/lib/openid_connect/discovery/provider.rb +3 -1
  10. data/lib/openid_connect/discovery/provider/config/response.rb +57 -78
  11. data/lib/openid_connect/request_object.rb +1 -8
  12. data/lib/openid_connect/request_object/{user_info.rb → userinfo.rb} +0 -0
  13. data/lib/openid_connect/response_object/id_token.rb +1 -1
  14. data/lib/openid_connect/response_object/userinfo.rb +3 -0
  15. data/lib/openid_connect/response_object/{user_info → userinfo}/open_id.rb +7 -6
  16. data/lib/openid_connect/response_object/{user_info → userinfo}/open_id/address.rb +0 -0
  17. data/openid_connect.gemspec +2 -2
  18. data/spec/helpers/webmock_helper.rb +2 -1
  19. data/spec/mock_response/discovery/config.json +3 -2
  20. data/spec/mock_response/public_keys/{jwk.json → jwks.json} +1 -1
  21. data/spec/mock_response/{user_info → userinfo}/openid.json +0 -0
  22. data/spec/openid_connect/access_token_spec.rb +7 -6
  23. data/spec/openid_connect/client/registrar_spec.rb +82 -207
  24. data/spec/openid_connect/client_spec.rb +2 -2
  25. data/spec/openid_connect/discovery/provider/config/response_spec.rb +53 -286
  26. data/spec/openid_connect/discovery/provider/config_spec.rb +11 -12
  27. data/spec/openid_connect/discovery/provider_spec.rb +1 -1
  28. data/spec/openid_connect/request_object_spec.rb +4 -4
  29. data/spec/openid_connect/response_object/id_token_spec.rb +4 -4
  30. data/spec/openid_connect/response_object/user_info/open_id_spec.rb +1 -0
  31. metadata +17 -20
  32. data/Gemfile.lock +0 -102
  33. data/lib/openid_connect/response_object/user_info.rb +0 -3
  34. data/spec/mock_response/public_keys/x509.pem +0 -21
@@ -3,14 +3,8 @@ module OpenIDConnect
3
3
  include JWTnizable
4
4
 
5
5
  attr_optional :client_id, :response_type, :redirect_uri, :scope, :state, :nonce, :display, :prompt, :userinfo, :id_token
6
- alias_method :user_info, :userinfo
7
6
  validate :require_at_least_one_attributes
8
7
 
9
- def initialize(attributes = {})
10
- attributes[:userinfo] ||= attributes[:user_info]
11
- super attributes
12
- end
13
-
14
8
  def id_token=(attributes = {})
15
9
  @id_token = IdToken.new(attributes) if attributes.present?
16
10
  end
@@ -18,7 +12,6 @@ module OpenIDConnect
18
12
  def userinfo=(attributes = {})
19
13
  @userinfo = UserInfo.new(attributes) if attributes.present?
20
14
  end
21
- alias_method :user_info=, :userinfo=
22
15
 
23
16
  def as_json_with_mixed_keys(options = {})
24
17
  hash = as_json_without_mixed_keys options
@@ -41,4 +34,4 @@ end
41
34
 
42
35
  require 'openid_connect/request_object/claimable'
43
36
  require 'openid_connect/request_object/id_token'
44
- require 'openid_connect/request_object/user_info'
37
+ require 'openid_connect/request_object/userinfo'
@@ -81,7 +81,7 @@ module OpenIDConnect
81
81
  end
82
82
 
83
83
  def self_issued_subject(jwk)
84
- subject_base_string = case jwk[:alg].to_s
84
+ subject_base_string = case jwk[:kty].to_s
85
85
  when 'RSA'
86
86
  [jwk[:n], jwk[:e]].join
87
87
  when 'EC'
@@ -0,0 +1,3 @@
1
+ Dir[File.dirname(__FILE__) + '/userinfo/*.rb'].each do |file|
2
+ require file
3
+ end
@@ -20,24 +20,25 @@ module OpenIDConnect
20
20
  :zoneinfo,
21
21
  :locale,
22
22
  :phone_number,
23
+ :phone_number_verified,
23
24
  :address,
24
25
  :updated_time
25
26
  )
26
27
  alias_method :subject, :sub
27
28
  alias_method :subject=, :sub=
28
29
 
29
- validates :email_verified, inclusion: {in: [true, false]}, allow_nil: true
30
- validates :gender, inclusion: {in: ['male', 'female']}, allow_nil: true
31
- validates :zoneinfo, inclusion: {in: TZInfo::TimezoneProxy.all.collect(&:name)}, allow_nil: true
32
- validates :profile, :picture, :website, url: true, allow_nil: true
33
- validates :email, email: true, allow_nil: true
30
+ validates :email_verified, :phone_number_verified, allow_nil: true, inclusion: {in: [true, false]}
31
+ validates :gender, allow_nil: true, inclusion: {in: ['male', 'female']}
32
+ validates :zoneinfo, allow_nil: true, inclusion: {in: TZInfo::TimezoneProxy.all.collect(&:name)}
33
+ validates :profile, :picture, :website, allow_nil: true, url: true
34
+ validates :email, allow_nil: true, email: true
34
35
  validate :validate_address
35
36
  validate :require_at_least_one_attributes
36
37
  # TODO: validate locale
37
38
 
38
39
  def initialize(attributes = {})
39
40
  super
40
- (all_attributes - [:email_verified, :address]).each do |key|
41
+ (all_attributes - [:email_verified, :phone_number_verified, :address]).each do |key|
41
42
  self.send "#{key}=", self.send(key).try(:to_s)
42
43
  end
43
44
  end
@@ -13,10 +13,10 @@ Gem::Specification.new do |s|
13
13
  s.add_runtime_dependency "json", ">= 1.4.3"
14
14
  s.add_runtime_dependency "tzinfo"
15
15
  s.add_runtime_dependency "attr_required", ">= 0.0.5"
16
- s.add_runtime_dependency "activemodel", ">= 3"
16
+ s.add_runtime_dependency "activemodel", "< 4"
17
17
  s.add_runtime_dependency "validate_url"
18
18
  s.add_runtime_dependency "validate_email"
19
- s.add_runtime_dependency "json-jwt", ">= 0.3.3"
19
+ s.add_runtime_dependency "json-jwt", ">= 0.5.5"
20
20
  s.add_runtime_dependency "swd", ">= 0.1.2"
21
21
  s.add_runtime_dependency "webfinger", ">= 0.0.2"
22
22
  s.add_runtime_dependency "rack-oauth2", ">= 1.0.0"
@@ -7,10 +7,11 @@ module WebMockHelper
7
7
  ).to_return(
8
8
  response_for(response_file, options)
9
9
  )
10
- yield
10
+ result = yield
11
11
  a_request(method, endpoint).with(
12
12
  request_for(method, options)
13
13
  ).should have_been_made.once
14
+ result
14
15
  end
15
16
 
16
17
  private
@@ -3,11 +3,12 @@
3
3
  "issuer": "https://connect-op.heroku.com",
4
4
  "authorization_endpoint": "https://connect-op.heroku.com/authorizations/new",
5
5
  "token_endpoint": "https://connect-op.heroku.com/access_tokens",
6
- "userinfo_endpoint": "https://connect-op.heroku.com/user_info",
6
+ "userinfo_endpoint": "https://connect-op.heroku.com/userinfo",
7
7
  "registration_endpoint": "https://connect-op.heroku.com/connect/client",
8
8
  "scopes_supported": ["openid", "profile", "email", "address"],
9
9
  "response_types_supported": ["code", "token", "id_token", "code token", "code id_token", "id_token token"],
10
10
  "subject_types_supported": ["public", "pairwise"],
11
11
  "claims_supported": ["sub", "iss", "name", "email"],
12
- "x509_url": "https://connect-op.heroku.com/cert.pem"
12
+ "jwks_uri": "https://connect-op.heroku.com/jwks.json",
13
+ "id_token_signing_alg_values_supported": ["RS256"]
13
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "keys": [{
3
- "alg": "RSA",
3
+ "kty": "RSA",
4
4
  "e": "AQAB",
5
5
  "n": "u4liYNFzgsRr1ERdUY7CY6r4nefi3RzIhK5fdPgdZSMEEflACWAuJu21_TcDpbZ1-6Kbq7zShFsVTAnBkWdO7EP1Rsn11fZpi9m_zEq_uRY-4RpNwp3S9xSdoQ4F3-js1EMaDQ6km0-c0gvr_TyhFqDj_6w_Bb0vFptfGXwfKewPPnhsi7GJ62ihZ32PzxOvEIYcaoXr9xaeudYD3BzWSDmjKGA7PMaEuBhScdUAoibCmsKB-yAGsz2amHnUhcl4B_EBs6wk65Y7ge0ZQJUOGPdUQL49VuALKmr7cMhHKh5KuQmPAi_20K2uZL_EFDaObDWZrclx98s0DmfTRKINtw"
6
6
  }]
@@ -92,18 +92,19 @@ describe OpenIDConnect::AccessToken do
92
92
  end
93
93
  end
94
94
 
95
- describe '#user_info!' do
96
- it 'should return OpenIDConnect::ResponseObject::UserInfo::OpenID' do
97
- mock_json :get, client.user_info_uri, 'user_info/openid', :HTTP_AUTHORIZATION => 'Bearer access_token', params: {
95
+ describe '#userinfo!' do
96
+ it do
97
+ userinfo = mock_json :get, client.userinfo_uri, 'userinfo/openid', :HTTP_AUTHORIZATION => 'Bearer access_token', params: {
98
98
  schema: 'openid'
99
99
  } do
100
- access_token.user_info!.should be_a OpenIDConnect::ResponseObject::UserInfo::OpenID
100
+ access_token.userinfo!
101
101
  end
102
+ userinfo.should be_instance_of OpenIDConnect::ResponseObject::UserInfo::OpenID
102
103
  end
103
104
 
104
105
  describe 'error handling' do
105
- let(:endpoint) { client.user_info_uri }
106
- let(:request) { access_token.user_info! }
106
+ let(:endpoint) { client.userinfo_uri }
107
+ let(:request) { access_token.userinfo! }
107
108
  it_behaves_like :access_token_error_handling
108
109
  end
109
110
  end
@@ -5,140 +5,93 @@ describe OpenIDConnect::Client::Registrar do
5
5
  let(:attributes) { minimum_attributes }
6
6
  let(:minimum_attributes) do
7
7
  {
8
- operation: :client_register
8
+ redirect_uris: ['https://client.example.com/callback']
9
9
  }
10
10
  end
11
11
  let(:instance) { OpenIDConnect::Client::Registrar.new(endpoint, attributes) }
12
12
  let(:endpoint) { 'https://server.example.com/clients' }
13
13
 
14
14
  context 'when endpoint given' do
15
- context 'when attributes given' do
16
- context 'when operation=client_register' do
17
- let(:attributes) do
18
- minimum_attributes
19
- end
20
- it { should be_valid }
21
- end
22
-
23
- context 'when operation=client_update' do
24
- context 'when client_id given' do
25
- let(:attributes) do
26
- {
27
- operation: :client_update,
28
- client_id: 'client.example.com'
29
- }
30
- end
31
- it { should be_valid }
32
- end
33
-
34
- context 'otherwise' do
35
- let(:attributes) do
36
- {
37
- operation: :client_update
38
- }
39
- end
40
- it { should_not be_valid }
41
- end
42
- end
43
-
44
- context 'otherwise' do
45
- let(:attributes) do
46
- {
47
- operation: :invalid_operation
48
- }
49
- end
50
- it { should_not be_valid }
15
+ context 'when required attributes given' do
16
+ let(:attributes) do
17
+ minimum_attributes
51
18
  end
19
+ it { should be_valid }
52
20
  end
53
21
 
54
22
  context 'otherwise' do
55
23
  let(:instance) { OpenIDConnect::Client::Registrar.new(endpoint) }
56
- it do
57
- expect do
58
- instance
59
- end.not_to raise_error
60
- end
61
24
  it { should_not be_valid }
62
25
  end
63
26
  end
64
27
 
65
28
  context 'otherwise' do
66
- let(:instance) { OpenIDConnect::Client::Registrar.new(endpoint) }
67
29
  let(:endpoint) { '' }
68
-
69
- it do
70
- expect do
71
- instance
72
- end.to raise_error AttrRequired::AttrMissing
73
- end
30
+ it { should_not be_valid }
74
31
  end
75
32
 
76
33
  describe '#sector_identifier' do
77
- context 'when sector_identifier_url given' do
34
+ context 'when sector_identifier_uri given' do
78
35
  let(:attributes) do
79
36
  minimum_attributes.merge(
80
- sector_identifier_url: 'https://client.example.com/sector_identifier.json'
37
+ sector_identifier_uri: 'https://client2.example.com/sector_identifier.json'
81
38
  )
82
39
  end
83
- its(:sector_identifier) { should == 'client.example.com' }
84
-
85
- context 'when sector_identifier_url is invalid URI' do
86
- let(:attributes) do
87
- minimum_attributes.merge(
88
- sector_identifier_url: ':invalid'
89
- )
90
- end
91
- its(:sector_identifier) { should be_nil }
92
- end
40
+ its(:sector_identifier) { should == 'client2.example.com' }
93
41
 
94
- context 'when redirect_uris given' do
42
+ context 'when sector_identifier_uri is invalid URI' do
95
43
  let(:attributes) do
96
44
  minimum_attributes.merge(
97
- sector_identifier_url: 'https://client.example.com/sector_identifier.json',
98
- redirect_uris: 'https://client2.example.com/callback'
45
+ sector_identifier_uri: 'invalid'
99
46
  )
100
47
  end
101
- its(:sector_identifier) { should == 'client.example.com' }
48
+ it { should_not be_valid }
102
49
  end
103
50
  end
104
51
 
105
52
  context 'otherwise' do
106
- context 'when redirect_uris given' do
107
- context 'when single host' do
108
- let(:attributes) do
109
- minimum_attributes.merge(
110
- redirect_uris: [
111
- 'https://client.example.com/callback/op1',
112
- 'https://client.example.com/callback/op2'
113
- ].join(' ')
114
- )
115
- end
116
- its(:sector_identifier) { should == 'client.example.com' }
53
+ let(:attributes) do
54
+ minimum_attributes.merge(
55
+ redirect_uris: redirect_uris
56
+ )
57
+ end
58
+
59
+ context 'when redirect_uris includes only one host' do
60
+ let(:redirect_uris) do
61
+ [
62
+ 'https://client.example.com/callback/op1',
63
+ 'https://client.example.com/callback/op2'
64
+ ]
117
65
  end
66
+ its(:sector_identifier) { should == 'client.example.com' }
67
+ end
118
68
 
119
- context 'when multi host' do
120
- let(:attributes) do
121
- minimum_attributes.merge(
122
- redirect_uris: [
123
- 'https://client1.example.com/callback',
124
- 'https://client2.example.com/callback'
125
- ].join(' ')
126
- )
127
- end
128
- its(:sector_identifier) { should be_nil }
69
+ context 'when redirect_uris includes multiple hosts' do
70
+ let(:redirect_uris) do
71
+ [
72
+ 'https://client1.example.com/callback',
73
+ 'https://client2.example.com/callback'
74
+ ]
129
75
  end
76
+ its(:sector_identifier) { should be_nil }
130
77
 
131
- context 'when invalid URI' do
78
+ context 'when subject_type=pairwise' do
132
79
  let(:attributes) do
133
80
  minimum_attributes.merge(
134
- redirect_uris: ':invalid'
81
+ redirect_uris: redirect_uris,
82
+ subject_type: :pairwise
135
83
  )
136
84
  end
137
- its(:sector_identifier) { should be_nil }
85
+ it { should_not be_valid }
138
86
  end
139
87
  end
140
88
 
141
- context 'otherwise' do
89
+ context 'when redirect_uris includes invalid URL' do
90
+ let(:redirect_uris) do
91
+ [
92
+ 'invalid'
93
+ ]
94
+ end
142
95
  its(:sector_identifier) { should be_nil }
143
96
  end
144
97
  end
@@ -146,7 +99,7 @@ describe OpenIDConnect::Client::Registrar do
146
99
 
147
100
  describe '#redirect_uris' do
148
101
  let(:base_url) { 'http://client.example.com/callback' }
149
- let(:attributes) { minimum_attributes.merge(redirect_uris: redirect_uri) }
102
+ let(:attributes) { minimum_attributes.merge(redirect_uris: [redirect_uri]) }
150
103
 
151
104
  context 'when query included' do
152
105
  let(:redirect_uri) { [base_url, '?foo=bar'].join }
@@ -156,41 +109,41 @@ describe OpenIDConnect::Client::Registrar do
156
109
 
157
110
  context 'when fragment included' do
158
111
  let(:redirect_uri) { [base_url, '#foo=bar'].join }
159
- it { should_not be_valid }
112
+ it { should be_valid }
160
113
  end
161
114
  end
162
115
 
163
116
  describe '#contacts' do
164
117
  context 'when contacts given' do
118
+ let(:attributes) do
119
+ minimum_attributes.merge(
120
+ contacts: contacts
121
+ )
122
+ end
123
+
165
124
  context 'when invalid email included' do
166
- let(:attributes) do
167
- minimum_attributes.merge(
168
- contacts: [
169
- ':invalid',
170
- 'nov@matake.jp'
171
- ].join(' ')
172
- )
125
+ let(:contacts) do
126
+ [
127
+ 'invalid',
128
+ 'nov@matake.jp'
129
+ ]
173
130
  end
174
131
  it { should_not be_valid }
175
132
  end
176
133
 
177
134
  context 'when localhost address included' do
178
- let(:attributes) do
179
- minimum_attributes.merge(
180
- contacts: [
181
- 'nov@localhost',
182
- 'nov@matake.jp'
183
- ].join(' ')
184
- )
135
+ let(:contacts) do
136
+ [
137
+ 'nov@localhost',
138
+ 'nov@matake.jp'
139
+ ]
185
140
  end
186
141
  it { should_not be_valid }
187
142
  end
188
143
 
189
144
  context 'otherwise' do
190
- let(:attributes) do
191
- minimum_attributes.merge(
192
- contacts: 'nov@matake.jp'
193
- )
145
+ let(:contacts) do
146
+ ['nov@matake.jp']
194
147
  end
195
148
  it { should be_valid }
196
149
  end
@@ -199,27 +152,16 @@ describe OpenIDConnect::Client::Registrar do
199
152
 
200
153
  describe '#as_json' do
201
154
  context 'when valid' do
202
- let(:attributes) do
203
- minimum_attributes.merge(
204
- redirect_uris: [
205
- 'https://client1.example.com/callback',
206
- 'https://client2.example.com/callback'
207
- ].join(' ')
208
- )
209
- end
210
155
  its(:as_json) do
211
- should == {
212
- operation: 'client_register',
213
- redirect_uris: 'https://client1.example.com/callback https://client2.example.com/callback'
214
- }
156
+ should == minimum_attributes
215
157
  end
216
158
  end
217
159
 
218
160
  context 'otherwise' do
219
161
  let(:attributes) do
220
- {
221
- operation: :client_update
222
- }
162
+ minimum_attributes.merge(
163
+ sector_identifier_uri: 'invalid'
164
+ )
223
165
  end
224
166
  it do
225
167
  expect do
@@ -230,27 +172,19 @@ describe OpenIDConnect::Client::Registrar do
230
172
  end
231
173
 
232
174
  describe '#register!' do
233
- let(:attributes) do
234
- {}
235
- end
236
-
237
175
  it 'should return OpenIDConnect::Client' do
238
- mock_json :post, endpoint, 'client/registered', params: {
239
- operation: 'client_register'
240
- } do
241
- client = instance.register!
242
- client.should be_instance_of OpenIDConnect::Client
243
- client.identifier.should == 'client.example.com'
244
- client.secret.should == 'client_secret'
245
- client.expires_in.should == 3600
176
+ client = mock_json :post, endpoint, 'client/registered', params: minimum_attributes do
177
+ instance.register!
246
178
  end
179
+ client.should be_instance_of OpenIDConnect::Client
180
+ client.identifier.should == 'client.example.com'
181
+ client.secret.should == 'client_secret'
182
+ client.expires_in.should == 3600
247
183
  end
248
184
 
249
185
  context 'when failed' do
250
186
  it 'should raise OpenIDConnect::Client::Registrar::RegistrationFailed' do
251
- mock_json :post, endpoint, 'errors/unknown', params: {
252
- operation: 'client_register'
253
- }, status: 400 do
187
+ mock_json :post, endpoint, 'errors/unknown', params: minimum_attributes, status: 400 do
254
188
  expect do
255
189
  instance.register!
256
190
  end.to raise_error OpenIDConnect::Client::Registrar::RegistrationFailed
@@ -259,66 +193,6 @@ describe OpenIDConnect::Client::Registrar do
259
193
  end
260
194
  end
261
195
 
262
- describe '#update!' do
263
- let(:attributes) do
264
- {
265
- client_id: 'client.example.com',
266
- client_secret: 'client_secret'
267
- }
268
- end
269
-
270
- it 'should return OpenIDConnect::Client' do
271
- mock_json :post, endpoint, 'client/updated', params: {
272
- operation: 'client_update',
273
- client_id: 'client.example.com',
274
- client_secret: 'client_secret',
275
- client_name: 'New Name'
276
- } do
277
- instance.client_name = 'New Name'
278
- client = instance.update!
279
- client.should be_instance_of OpenIDConnect::Client
280
- client.identifier.should == 'client.example.com'
281
- end
282
- end
283
-
284
- context 'when failed' do
285
- it 'should raise OpenIDConnect::Client::Registrar::RegistrationFailed' do
286
- mock_json :post, endpoint, 'errors/unknown', params: {
287
- operation: 'client_update',
288
- client_id: 'client.example.com',
289
- client_secret: 'client_secret'
290
- }, status: 400 do
291
- expect do
292
- instance.update!
293
- end.to raise_error OpenIDConnect::Client::Registrar::RegistrationFailed
294
- end
295
- end
296
- end
297
- end
298
-
299
- describe '#rotate_secret!' do
300
- let(:attributes) do
301
- {
302
- client_id: 'client.example.com',
303
- client_secret: 'client_secret'
304
- }
305
- end
306
-
307
- it 'should return OpenIDConnect::Client' do
308
- mock_json :post, endpoint, 'client/rotated', params: {
309
- operation: 'rotate_secret',
310
- client_id: 'client.example.com',
311
- client_secret: 'client_secret'
312
- } do
313
- client = instance.rotate_secret!
314
- client.should be_instance_of OpenIDConnect::Client
315
- client.identifier.should == 'client.example.com'
316
- client.secret.should == 'new_client_secret'
317
- client.expires_in.should == 3600
318
- end
319
- end
320
- end
321
-
322
196
  describe '#validate!' do
323
197
  context 'when valid' do
324
198
  it do
@@ -330,10 +204,11 @@ describe OpenIDConnect::Client::Registrar do
330
204
 
331
205
  context 'otherwise' do
332
206
  let(:attributes) do
333
- {
334
- operation: :client_update
335
- }
207
+ minimum_attributes.merge(
208
+ sector_identifier_uri: 'invalid'
209
+ )
336
210
  end
211
+
337
212
  it do
338
213
  expect do
339
214
  instance.validate!
@@ -345,15 +220,15 @@ describe OpenIDConnect::Client::Registrar do
345
220
  describe 'http_client' do
346
221
  subject { instance.send(:http_client) }
347
222
 
348
- context 'when access_token given' do
223
+ context 'when initial_access_token given' do
349
224
  let(:attributes) do
350
225
  minimum_attributes.merge(
351
- access_token: access_token
226
+ initial_access_token: initial_access_token
352
227
  )
353
228
  end
354
229
 
355
230
  context 'when Rack::OAuth2::AccessToken::Bearer given' do
356
- let(:access_token) do
231
+ let(:initial_access_token) do
357
232
  Rack::OAuth2::AccessToken::Bearer.new(access_token: 'access_token')
358
233
  end
359
234
  it { should be_instance_of Rack::OAuth2::AccessToken::Bearer }
@@ -361,7 +236,7 @@ describe OpenIDConnect::Client::Registrar do
361
236
  end
362
237
 
363
238
  context 'otherwise' do
364
- let(:access_token) { 'access_token' }
239
+ let(:initial_access_token) { 'access_token' }
365
240
  it { should be_instance_of Rack::OAuth2::AccessToken::Bearer }
366
241
  its(:access_token) { should == 'access_token' }
367
242
  end