omniauth-oauthio 0.1.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 +7 -0
- data/.gitignore +10 -0
- data/Gemfile +7 -0
- data/LICENSE +20 -0
- data/README.md +118 -0
- data/Rakefile +8 -0
- data/example/Gemfile +4 -0
- data/example/Gemfile.lock +44 -0
- data/example/config.ru +110 -0
- data/lib/oauthio/access_token.rb +47 -0
- data/lib/oauthio/client.rb +158 -0
- data/lib/oauthio/providers/oauthio.rb +84 -0
- data/lib/oauthio/strategy/auth_code.rb +36 -0
- data/lib/omniauth/oauthio/version.rb +5 -0
- data/lib/omniauth/oauthio.rb +9 -0
- data/lib/omniauth/strategies/oauthio.rb +158 -0
- data/lib/omniauth-oauthio.rb +1 -0
- data/omniauth-oauthio.gemspec +24 -0
- data/test/helper.rb +56 -0
- data/test/support/shared_examples.rb +85 -0
- data/test/test.rb +541 -0
- metadata +123 -0
data/test/test.rb
ADDED
@@ -0,0 +1,541 @@
|
|
1
|
+
#require 'helper'
|
2
|
+
#require 'omniauth-facebook'
|
3
|
+
#require 'openssl'
|
4
|
+
#require 'base64'
|
5
|
+
#
|
6
|
+
#class StrategyTest < StrategyTestCase
|
7
|
+
# include OauthioStrategyTests
|
8
|
+
#end
|
9
|
+
#
|
10
|
+
#class ClientTest < StrategyTestCase
|
11
|
+
# test 'has correct Facebook site' do
|
12
|
+
# assert_equal 'https://graph.facebook.com', strategy.client.site
|
13
|
+
# end
|
14
|
+
#
|
15
|
+
# test 'has correct authorize url' do
|
16
|
+
# assert_equal 'https://www.facebook.com/dialog/oauth', strategy.client.options[:authorize_url]
|
17
|
+
# end
|
18
|
+
#
|
19
|
+
# test 'has correct token url' do
|
20
|
+
# assert_equal '/oauth/access_token', strategy.client.options[:token_url]
|
21
|
+
# end
|
22
|
+
#end
|
23
|
+
#
|
24
|
+
#class CallbackUrlTest < StrategyTestCase
|
25
|
+
# test "returns the default callback url" do
|
26
|
+
# url_base = 'http://auth.request.com'
|
27
|
+
# @request.stubs(:url).returns("#{url_base}/some/page")
|
28
|
+
# strategy.stubs(:script_name).returns('') # as not to depend on Rack env
|
29
|
+
# assert_equal "#{url_base}/auth/facebook/callback", strategy.callback_url
|
30
|
+
# end
|
31
|
+
#
|
32
|
+
# test "returns path from callback_path option" do
|
33
|
+
# @options = { :callback_path => "/auth/FB/done"}
|
34
|
+
# url_base = 'http://auth.request.com'
|
35
|
+
# @request.stubs(:url).returns("#{url_base}/page/path")
|
36
|
+
# strategy.stubs(:script_name).returns('') # as not to depend on Rack env
|
37
|
+
# assert_equal "#{url_base}/auth/FB/done", strategy.callback_url
|
38
|
+
# end
|
39
|
+
#
|
40
|
+
# test "returns url from callback_url option" do
|
41
|
+
# url = 'https://auth.myapp.com/auth/fb/callback'
|
42
|
+
# @options = { :callback_url => url }
|
43
|
+
# assert_equal url, strategy.callback_url
|
44
|
+
# end
|
45
|
+
#end
|
46
|
+
#
|
47
|
+
#class AuthorizeParamsTest < StrategyTestCase
|
48
|
+
# test 'includes default scope for email' do
|
49
|
+
# assert strategy.authorize_params.is_a?(Hash)
|
50
|
+
# assert_equal 'email', strategy.authorize_params[:scope]
|
51
|
+
# end
|
52
|
+
#
|
53
|
+
# test 'includes display parameter from request when present' do
|
54
|
+
# @request.stubs(:params).returns({ 'display' => 'touch' })
|
55
|
+
# assert strategy.authorize_params.is_a?(Hash)
|
56
|
+
# assert_equal 'touch', strategy.authorize_params[:display]
|
57
|
+
# end
|
58
|
+
#
|
59
|
+
# test 'includes auth_type parameter from request when present' do
|
60
|
+
# @request.stubs(:params).returns({ 'auth_type' => 'reauthenticate' })
|
61
|
+
# assert strategy.authorize_params.is_a?(Hash)
|
62
|
+
# assert_equal 'reauthenticate', strategy.authorize_params[:auth_type]
|
63
|
+
# end
|
64
|
+
#
|
65
|
+
# test 'overrides default scope with parameter passed from request' do
|
66
|
+
# @request.stubs(:params).returns({ 'scope' => 'email' })
|
67
|
+
# assert strategy.authorize_params.is_a?(Hash)
|
68
|
+
# assert_equal 'email', strategy.authorize_params[:scope]
|
69
|
+
# end
|
70
|
+
#end
|
71
|
+
#
|
72
|
+
#class TokeParamsTest < StrategyTestCase
|
73
|
+
# test 'has correct parse strategy' do
|
74
|
+
# assert_equal :query, strategy.token_params[:parse]
|
75
|
+
# end
|
76
|
+
#end
|
77
|
+
#
|
78
|
+
#class AccessTokenOptionsTest < StrategyTestCase
|
79
|
+
# test 'has correct param name by default' do
|
80
|
+
# assert_equal 'access_token', strategy.access_token_options[:param_name]
|
81
|
+
# end
|
82
|
+
#
|
83
|
+
# test 'has correct header format by default' do
|
84
|
+
# assert_equal 'OAuth %s', strategy.access_token_options[:header_format]
|
85
|
+
# end
|
86
|
+
#end
|
87
|
+
#
|
88
|
+
#class UidTest < StrategyTestCase
|
89
|
+
# def setup
|
90
|
+
# super
|
91
|
+
# strategy.stubs(:raw_info).returns({ 'id' => '123' })
|
92
|
+
# end
|
93
|
+
#
|
94
|
+
# test 'returns the id from raw_info' do
|
95
|
+
# assert_equal '123', strategy.uid
|
96
|
+
# end
|
97
|
+
#end
|
98
|
+
#
|
99
|
+
#class InfoTest < StrategyTestCase
|
100
|
+
# test 'returns the secure facebook avatar url when `secure_image_url` option is specified' do
|
101
|
+
# @options = { :secure_image_url => true }
|
102
|
+
# raw_info = { 'name' => 'Fred Smith', 'id' => '321' }
|
103
|
+
# strategy.stubs(:raw_info).returns(raw_info)
|
104
|
+
# assert_equal 'https://graph.facebook.com/321/picture', strategy.info['image']
|
105
|
+
# end
|
106
|
+
#
|
107
|
+
# test 'returns the image with size specified in the `image_size` option' do
|
108
|
+
# @options = { :image_size => 'normal' }
|
109
|
+
# raw_info = { 'name' => 'Fred Smith', 'id' => '321' }
|
110
|
+
# strategy.stubs(:raw_info).returns(raw_info)
|
111
|
+
# assert_equal 'http://graph.facebook.com/321/picture?type=normal', strategy.info['image']
|
112
|
+
# end
|
113
|
+
#
|
114
|
+
# test 'returns the image with width and height specified in the `image_size` option' do
|
115
|
+
# @options = { :image_size => { :width => 123, :height => 987 } }
|
116
|
+
# raw_info = { 'name' => 'Fred Smith', 'id' => '321' }
|
117
|
+
# strategy.stubs(:raw_info).returns(raw_info)
|
118
|
+
# assert_match 'width=123', strategy.info['image']
|
119
|
+
# assert_match 'height=987', strategy.info['image']
|
120
|
+
# assert_match 'http://graph.facebook.com/321/picture?', strategy.info['image']
|
121
|
+
# end
|
122
|
+
#end
|
123
|
+
#
|
124
|
+
#class InfoTestOptionalDataPresent < StrategyTestCase
|
125
|
+
# def setup
|
126
|
+
# super
|
127
|
+
# @raw_info ||= { 'name' => 'Fred Smith' }
|
128
|
+
# strategy.stubs(:raw_info).returns(@raw_info)
|
129
|
+
# end
|
130
|
+
#
|
131
|
+
# test 'returns the name' do
|
132
|
+
# assert_equal 'Fred Smith', strategy.info['name']
|
133
|
+
# end
|
134
|
+
#
|
135
|
+
# test 'returns the email' do
|
136
|
+
# @raw_info['email'] = 'fred@smith.com'
|
137
|
+
# assert_equal 'fred@smith.com', strategy.info['email']
|
138
|
+
# end
|
139
|
+
#
|
140
|
+
# test 'returns the username as nickname' do
|
141
|
+
# @raw_info['username'] = 'fredsmith'
|
142
|
+
# assert_equal 'fredsmith', strategy.info['nickname']
|
143
|
+
# end
|
144
|
+
#
|
145
|
+
# test 'returns the first name' do
|
146
|
+
# @raw_info['first_name'] = 'Fred'
|
147
|
+
# assert_equal 'Fred', strategy.info['first_name']
|
148
|
+
# end
|
149
|
+
#
|
150
|
+
# test 'returns the last name' do
|
151
|
+
# @raw_info['last_name'] = 'Smith'
|
152
|
+
# assert_equal 'Smith', strategy.info['last_name']
|
153
|
+
# end
|
154
|
+
#
|
155
|
+
# test 'returns the location name as location' do
|
156
|
+
# @raw_info['location'] = { 'id' => '104022926303756', 'name' => 'Palo Alto, California' }
|
157
|
+
# assert_equal 'Palo Alto, California', strategy.info['location']
|
158
|
+
# end
|
159
|
+
#
|
160
|
+
# test 'returns bio as description' do
|
161
|
+
# @raw_info['bio'] = 'I am great'
|
162
|
+
# assert_equal 'I am great', strategy.info['description']
|
163
|
+
# end
|
164
|
+
#
|
165
|
+
# test 'returns the facebook avatar url' do
|
166
|
+
# @raw_info['id'] = '321'
|
167
|
+
# assert_equal 'http://graph.facebook.com/321/picture', strategy.info['image']
|
168
|
+
# end
|
169
|
+
#
|
170
|
+
# test 'returns the Facebook link as the Facebook url' do
|
171
|
+
# @raw_info['link'] = 'http://www.facebook.com/fredsmith'
|
172
|
+
# assert_kind_of Hash, strategy.info['urls']
|
173
|
+
# assert_equal 'http://www.facebook.com/fredsmith', strategy.info['urls']['Facebook']
|
174
|
+
# end
|
175
|
+
#
|
176
|
+
# test 'returns website url' do
|
177
|
+
# @raw_info['website'] = 'https://my-wonderful-site.com'
|
178
|
+
# assert_kind_of Hash, strategy.info['urls']
|
179
|
+
# assert_equal 'https://my-wonderful-site.com', strategy.info['urls']['Website']
|
180
|
+
# end
|
181
|
+
#
|
182
|
+
# test 'return both Facebook link and website urls' do
|
183
|
+
# @raw_info['link'] = 'http://www.facebook.com/fredsmith'
|
184
|
+
# @raw_info['website'] = 'https://my-wonderful-site.com'
|
185
|
+
# assert_kind_of Hash, strategy.info['urls']
|
186
|
+
# assert_equal 'http://www.facebook.com/fredsmith', strategy.info['urls']['Facebook']
|
187
|
+
# assert_equal 'https://my-wonderful-site.com', strategy.info['urls']['Website']
|
188
|
+
# end
|
189
|
+
#
|
190
|
+
# test 'returns the positive verified status' do
|
191
|
+
# @raw_info['verified'] = true
|
192
|
+
# assert strategy.info['verified']
|
193
|
+
# end
|
194
|
+
#
|
195
|
+
# test 'returns the negative verified status' do
|
196
|
+
# @raw_info['verified'] = false
|
197
|
+
# refute strategy.info['verified']
|
198
|
+
# end
|
199
|
+
#end
|
200
|
+
#
|
201
|
+
#class InfoTestOptionalDataNotPresent < StrategyTestCase
|
202
|
+
# def setup
|
203
|
+
# super
|
204
|
+
# @raw_info ||= { 'name' => 'Fred Smith' }
|
205
|
+
# strategy.stubs(:raw_info).returns(@raw_info)
|
206
|
+
# end
|
207
|
+
#
|
208
|
+
# test 'has no email key' do
|
209
|
+
# refute_has_key 'email', strategy.info
|
210
|
+
# end
|
211
|
+
#
|
212
|
+
# test 'has no nickname key' do
|
213
|
+
# refute_has_key 'nickname', strategy.info
|
214
|
+
# end
|
215
|
+
#
|
216
|
+
# test 'has no first name key' do
|
217
|
+
# refute_has_key 'first_name', strategy.info
|
218
|
+
# end
|
219
|
+
#
|
220
|
+
# test 'has no last name key' do
|
221
|
+
# refute_has_key 'last_name', strategy.info
|
222
|
+
# end
|
223
|
+
#
|
224
|
+
# test 'has no location key' do
|
225
|
+
# refute_has_key 'location', strategy.info
|
226
|
+
# end
|
227
|
+
#
|
228
|
+
# test 'has no description key' do
|
229
|
+
# refute_has_key 'description', strategy.info
|
230
|
+
# end
|
231
|
+
#
|
232
|
+
# test 'has no urls' do
|
233
|
+
# refute_has_key 'urls', strategy.info
|
234
|
+
# end
|
235
|
+
#
|
236
|
+
# test 'has no verified key' do
|
237
|
+
# refute_has_key 'verified', strategy.info
|
238
|
+
# end
|
239
|
+
#end
|
240
|
+
#
|
241
|
+
#class RawInfoTest < StrategyTestCase
|
242
|
+
# def setup
|
243
|
+
# super
|
244
|
+
# @access_token = stub('Oauthio::AccessToken')
|
245
|
+
# @appsecret_proof = 'appsecret_proof'
|
246
|
+
# @options = {:appsecret_proof => @appsecret_proof}
|
247
|
+
# end
|
248
|
+
#
|
249
|
+
# test 'performs a GET to https://graph.facebook.com/me' do
|
250
|
+
# strategy.stubs(:appsecret_proof).returns(@appsecret_proof)
|
251
|
+
# strategy.stubs(:access_token).returns(@access_token)
|
252
|
+
# params = {:params => @options}
|
253
|
+
# @access_token.expects(:get).with('/me', params).returns(stub_everything('Oauthio::Response'))
|
254
|
+
# strategy.raw_info
|
255
|
+
# end
|
256
|
+
#
|
257
|
+
# test 'performs a GET to https://graph.facebook.com/me with locale' do
|
258
|
+
# @options.merge!({ :locale => 'cs_CZ' })
|
259
|
+
# strategy.stubs(:access_token).returns(@access_token)
|
260
|
+
# strategy.stubs(:appsecret_proof).returns(@appsecret_proof)
|
261
|
+
# params = {:params => @options}
|
262
|
+
# @access_token.expects(:get).with('/me', params).returns(stub_everything('Oauthio::Response'))
|
263
|
+
# strategy.raw_info
|
264
|
+
# end
|
265
|
+
#
|
266
|
+
# test 'performs a GET to https://graph.facebook.com/me with info_fields' do
|
267
|
+
# @options.merge!({:info_fields => 'about'})
|
268
|
+
# strategy.stubs(:access_token).returns(@access_token)
|
269
|
+
# strategy.stubs(:appsecret_proof).returns(@appsecret_proof)
|
270
|
+
# params = {:params => {:appsecret_proof => @appsecret_proof, :fields => 'about'}}
|
271
|
+
# @access_token.expects(:get).with('/me', params).returns(stub_everything('Oauthio::Response'))
|
272
|
+
# strategy.raw_info
|
273
|
+
# end
|
274
|
+
#
|
275
|
+
# test 'returns a Hash' do
|
276
|
+
# strategy.stubs(:access_token).returns(@access_token)
|
277
|
+
# strategy.stubs(:appsecret_proof).returns(@appsecret_proof)
|
278
|
+
# raw_response = stub('Faraday::Response')
|
279
|
+
# raw_response.stubs(:body).returns('{ "ohai": "thar" }')
|
280
|
+
# raw_response.stubs(:status).returns(200)
|
281
|
+
# raw_response.stubs(:headers).returns({'Content-Type' => 'application/json' })
|
282
|
+
# Oauthio_response = Oauthio::Response.new(raw_response)
|
283
|
+
# params = {:params => @options}
|
284
|
+
# @access_token.stubs(:get).with('/me', params).returns(Oauthio_response)
|
285
|
+
# assert_kind_of Hash, strategy.raw_info
|
286
|
+
# assert_equal 'thar', strategy.raw_info['ohai']
|
287
|
+
# end
|
288
|
+
#
|
289
|
+
# test 'returns an empty hash when the response is false' do
|
290
|
+
# strategy.stubs(:access_token).returns(@access_token)
|
291
|
+
# strategy.stubs(:appsecret_proof).returns(@appsecret_proof)
|
292
|
+
# Oauthio_response = stub('Oauthio::Response', :parsed => false)
|
293
|
+
# params = {:params => @options}
|
294
|
+
# @access_token.stubs(:get).with('/me', params).returns(Oauthio_response)
|
295
|
+
# assert_kind_of Hash, strategy.raw_info
|
296
|
+
# assert_equal({}, strategy.raw_info)
|
297
|
+
# end
|
298
|
+
#
|
299
|
+
# test 'should not include raw_info in extras hash when skip_info is specified' do
|
300
|
+
# @options = { :skip_info => true }
|
301
|
+
# strategy.stubs(:raw_info).returns({:foo => 'bar' })
|
302
|
+
# refute_has_key 'raw_info', strategy.extra
|
303
|
+
# end
|
304
|
+
#end
|
305
|
+
#
|
306
|
+
#class CredentialsTest < StrategyTestCase
|
307
|
+
# def setup
|
308
|
+
# super
|
309
|
+
# @access_token = stub('Oauthio::AccessToken')
|
310
|
+
# @access_token.stubs(:token)
|
311
|
+
# @access_token.stubs(:expires?)
|
312
|
+
# @access_token.stubs(:expires_at)
|
313
|
+
# @access_token.stubs(:refresh_token)
|
314
|
+
# strategy.stubs(:access_token).returns(@access_token)
|
315
|
+
# end
|
316
|
+
#
|
317
|
+
# test 'returns a Hash' do
|
318
|
+
# assert_kind_of Hash, strategy.credentials
|
319
|
+
# end
|
320
|
+
#
|
321
|
+
# test 'returns the token' do
|
322
|
+
# @access_token.stubs(:token).returns('123')
|
323
|
+
# assert_equal '123', strategy.credentials['token']
|
324
|
+
# end
|
325
|
+
#
|
326
|
+
# test 'returns the expiry status' do
|
327
|
+
# @access_token.stubs(:expires?).returns(true)
|
328
|
+
# assert strategy.credentials['expires']
|
329
|
+
#
|
330
|
+
# @access_token.stubs(:expires?).returns(false)
|
331
|
+
# refute strategy.credentials['expires']
|
332
|
+
# end
|
333
|
+
#
|
334
|
+
# test 'returns the refresh token and expiry time when expiring' do
|
335
|
+
# ten_mins_from_now = (Time.now + 600).to_i
|
336
|
+
# @access_token.stubs(:expires?).returns(true)
|
337
|
+
# @access_token.stubs(:refresh_token).returns('321')
|
338
|
+
# @access_token.stubs(:expires_at).returns(ten_mins_from_now)
|
339
|
+
# assert_equal '321', strategy.credentials['refresh_token']
|
340
|
+
# assert_equal ten_mins_from_now, strategy.credentials['expires_at']
|
341
|
+
# end
|
342
|
+
#
|
343
|
+
# test 'does not return the refresh token when test is nil and expiring' do
|
344
|
+
# @access_token.stubs(:expires?).returns(true)
|
345
|
+
# @access_token.stubs(:refresh_token).returns(nil)
|
346
|
+
# assert_nil strategy.credentials['refresh_token']
|
347
|
+
# refute_has_key 'refresh_token', strategy.credentials
|
348
|
+
# end
|
349
|
+
#
|
350
|
+
# test 'does not return the refresh token when not expiring' do
|
351
|
+
# @access_token.stubs(:expires?).returns(false)
|
352
|
+
# @access_token.stubs(:refresh_token).returns('XXX')
|
353
|
+
# assert_nil strategy.credentials['refresh_token']
|
354
|
+
# refute_has_key 'refresh_token', strategy.credentials
|
355
|
+
# end
|
356
|
+
#end
|
357
|
+
#
|
358
|
+
#class ExtraTest < StrategyTestCase
|
359
|
+
# def setup
|
360
|
+
# super
|
361
|
+
# @raw_info = { 'name' => 'Fred Smith' }
|
362
|
+
# strategy.stubs(:raw_info).returns(@raw_info)
|
363
|
+
# end
|
364
|
+
#
|
365
|
+
# test 'returns a Hash' do
|
366
|
+
# assert_kind_of Hash, strategy.extra
|
367
|
+
# end
|
368
|
+
#
|
369
|
+
# test 'contains raw info' do
|
370
|
+
# assert_equal({ 'raw_info' => @raw_info }, strategy.extra)
|
371
|
+
# end
|
372
|
+
#end
|
373
|
+
#
|
374
|
+
#module SignedRequestHelpers
|
375
|
+
# def signed_request(payload, secret)
|
376
|
+
# encoded_payload = base64_encode_url(MultiJson.encode(payload))
|
377
|
+
# encoded_signature = base64_encode_url(signature(encoded_payload, secret))
|
378
|
+
# [encoded_signature, encoded_payload].join('.')
|
379
|
+
# end
|
380
|
+
#
|
381
|
+
# def base64_encode_url(value)
|
382
|
+
# Base64.encode64(value).tr('+/', '-_').gsub(/\n/, '')
|
383
|
+
# end
|
384
|
+
#
|
385
|
+
# def signature(payload, secret, algorithm = OpenSSL::Digest::SHA256.new)
|
386
|
+
# OpenSSL::HMAC.digest(algorithm, secret, payload)
|
387
|
+
# end
|
388
|
+
#end
|
389
|
+
#
|
390
|
+
#module SignedRequestTests
|
391
|
+
# class TestCase < StrategyTestCase
|
392
|
+
# include SignedRequestHelpers
|
393
|
+
# end
|
394
|
+
#
|
395
|
+
# class CookieAndParamNotPresentTest < TestCase
|
396
|
+
# test 'is nil' do
|
397
|
+
# assert_nil strategy.send(:signed_request)
|
398
|
+
# end
|
399
|
+
#
|
400
|
+
# test 'throws an error on calling build_access_token' do
|
401
|
+
# assert_equal 'must pass either a `code` parameter or a signed request (via `signed_request` parameter or a `fbsr_XXX` cookie)',
|
402
|
+
# assert_raises(OmniAuth::Strategies::Facebook::NoAuthorizationCodeError) { strategy.send(:build_access_token) }.message
|
403
|
+
# end
|
404
|
+
# end
|
405
|
+
#
|
406
|
+
# class CookiePresentTest < TestCase
|
407
|
+
# def setup(algo = nil)
|
408
|
+
# super()
|
409
|
+
# @payload = {
|
410
|
+
# 'algorithm' => algo || 'HMAC-SHA256',
|
411
|
+
# 'code' => 'm4c0d3z',
|
412
|
+
# 'issued_at' => Time.now.to_i,
|
413
|
+
# 'user_id' => '123456'
|
414
|
+
# }
|
415
|
+
#
|
416
|
+
# @request.stubs(:cookies).returns({"fbsr_#{@client_id}" => signed_request(@payload, @client_secret)})
|
417
|
+
# end
|
418
|
+
#
|
419
|
+
# test 'parses the access code out from the cookie' do
|
420
|
+
# assert_equal @payload, strategy.send(:signed_request)
|
421
|
+
# end
|
422
|
+
#
|
423
|
+
# test 'throws an error if the algorithm is unknown' do
|
424
|
+
# setup('UNKNOWN-ALGO')
|
425
|
+
# assert_equal "unknown algorithm: UNKNOWN-ALGO", assert_raises(OmniAuth::Strategies::Facebook::UnknownSignatureAlgorithmError) { strategy.send(:signed_request) }.message
|
426
|
+
# end
|
427
|
+
# end
|
428
|
+
#
|
429
|
+
# class ParamPresentTest < TestCase
|
430
|
+
# def setup(algo = nil)
|
431
|
+
# super()
|
432
|
+
# @payload = {
|
433
|
+
# 'algorithm' => algo || 'HMAC-SHA256',
|
434
|
+
# 'oauth_token' => 'XXX',
|
435
|
+
# 'issued_at' => Time.now.to_i,
|
436
|
+
# 'user_id' => '123456'
|
437
|
+
# }
|
438
|
+
#
|
439
|
+
# @request.stubs(:params).returns({'signed_request' => signed_request(@payload, @client_secret)})
|
440
|
+
# end
|
441
|
+
#
|
442
|
+
# test 'parses the access code out from the param' do
|
443
|
+
# assert_equal @payload, strategy.send(:signed_request)
|
444
|
+
# end
|
445
|
+
#
|
446
|
+
# test 'throws an error if the algorithm is unknown' do
|
447
|
+
# setup('UNKNOWN-ALGO')
|
448
|
+
# assert_equal "unknown algorithm: UNKNOWN-ALGO", assert_raises(OmniAuth::Strategies::Facebook::UnknownSignatureAlgorithmError) { strategy.send(:signed_request) }.message
|
449
|
+
# end
|
450
|
+
# end
|
451
|
+
#
|
452
|
+
# class CookieAndParamPresentTest < TestCase
|
453
|
+
# def setup
|
454
|
+
# super
|
455
|
+
# @payload_from_cookie = {
|
456
|
+
# 'algorithm' => 'HMAC-SHA256',
|
457
|
+
# 'from' => 'cookie'
|
458
|
+
# }
|
459
|
+
#
|
460
|
+
# @request.stubs(:cookies).returns({"fbsr_#{@client_id}" => signed_request(@payload_from_cookie, @client_secret)})
|
461
|
+
#
|
462
|
+
# @payload_from_param = {
|
463
|
+
# 'algorithm' => 'HMAC-SHA256',
|
464
|
+
# 'from' => 'param'
|
465
|
+
# }
|
466
|
+
#
|
467
|
+
# @request.stubs(:params).returns({'signed_request' => signed_request(@payload_from_param, @client_secret)})
|
468
|
+
# end
|
469
|
+
#
|
470
|
+
# test 'picks param over cookie' do
|
471
|
+
# assert_equal @payload_from_param, strategy.send(:signed_request)
|
472
|
+
# end
|
473
|
+
# end
|
474
|
+
#
|
475
|
+
# class EmptySignedRequestTest < TestCase
|
476
|
+
# def setup
|
477
|
+
# super
|
478
|
+
# @request.stubs(:params).returns({'signed_request' => ''})
|
479
|
+
# end
|
480
|
+
#
|
481
|
+
# test 'empty param' do
|
482
|
+
# assert_equal nil, strategy.send(:signed_request)
|
483
|
+
# end
|
484
|
+
# end
|
485
|
+
#
|
486
|
+
#end
|
487
|
+
#
|
488
|
+
#class RequestPhaseWithSignedRequestTest < StrategyTestCase
|
489
|
+
# include SignedRequestHelpers
|
490
|
+
#
|
491
|
+
# def setup
|
492
|
+
# super
|
493
|
+
#
|
494
|
+
# payload = {
|
495
|
+
# 'algorithm' => 'HMAC-SHA256',
|
496
|
+
# 'oauth_token' => 'm4c0d3z'
|
497
|
+
# }
|
498
|
+
# @raw_signed_request = signed_request(payload, @client_secret)
|
499
|
+
# @request.stubs(:params).returns("signed_request" => @raw_signed_request)
|
500
|
+
#
|
501
|
+
# strategy.stubs(:callback_url).returns('/')
|
502
|
+
# end
|
503
|
+
#
|
504
|
+
# test 'redirects to callback passing along signed request' do
|
505
|
+
# strategy.expects(:redirect).with("/?signed_request=#{Rack::Utils.escape(@raw_signed_request)}").once
|
506
|
+
# strategy.request_phase
|
507
|
+
# end
|
508
|
+
#end
|
509
|
+
#
|
510
|
+
#module BuildAccessTokenTests
|
511
|
+
# class TestCase < StrategyTestCase
|
512
|
+
# include SignedRequestHelpers
|
513
|
+
# end
|
514
|
+
#
|
515
|
+
# class ParamsContainSignedRequestWithAccessTokenTest < TestCase
|
516
|
+
# def setup
|
517
|
+
# super
|
518
|
+
#
|
519
|
+
# @payload = {
|
520
|
+
# 'algorithm' => 'HMAC-SHA256',
|
521
|
+
# 'oauth_token' => 'm4c0d3z',
|
522
|
+
# 'expires' => Time.now.to_i
|
523
|
+
# }
|
524
|
+
# @raw_signed_request = signed_request(@payload, @client_secret)
|
525
|
+
# @request.stubs(:params).returns({"signed_request" => @raw_signed_request})
|
526
|
+
#
|
527
|
+
# strategy.stubs(:callback_url).returns('/')
|
528
|
+
# end
|
529
|
+
#
|
530
|
+
# test 'returns a new access token from the signed request' do
|
531
|
+
# result = strategy.send(:build_access_token)
|
532
|
+
# assert_kind_of ::Oauthio::AccessToken, result
|
533
|
+
# assert_equal @payload['oauth_token'], result.token
|
534
|
+
# end
|
535
|
+
#
|
536
|
+
# test 'returns an access token with the correct expiry time' do
|
537
|
+
# result = strategy.send(:build_access_token)
|
538
|
+
# assert_equal @payload['expires'], result.expires_at
|
539
|
+
# end
|
540
|
+
# end
|
541
|
+
#end
|
metadata
ADDED
@@ -0,0 +1,123 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: omniauth-oauthio
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jonathan Rowlands
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-08-11 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: omniauth-oauth2
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.1'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.1'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: minitest
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: mocha
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rake
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
description:
|
70
|
+
email:
|
71
|
+
- jonrowlands83@gmail.com
|
72
|
+
executables: []
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- ".gitignore"
|
77
|
+
- Gemfile
|
78
|
+
- LICENSE
|
79
|
+
- README.md
|
80
|
+
- Rakefile
|
81
|
+
- example/Gemfile
|
82
|
+
- example/Gemfile.lock
|
83
|
+
- example/config.ru
|
84
|
+
- lib/oauthio/access_token.rb
|
85
|
+
- lib/oauthio/client.rb
|
86
|
+
- lib/oauthio/providers/oauthio.rb
|
87
|
+
- lib/oauthio/strategy/auth_code.rb
|
88
|
+
- lib/omniauth-oauthio.rb
|
89
|
+
- lib/omniauth/oauthio.rb
|
90
|
+
- lib/omniauth/oauthio/version.rb
|
91
|
+
- lib/omniauth/strategies/oauthio.rb
|
92
|
+
- omniauth-oauthio.gemspec
|
93
|
+
- test/helper.rb
|
94
|
+
- test/support/shared_examples.rb
|
95
|
+
- test/test.rb
|
96
|
+
homepage: https://github.com/jgrowl/omniauth-oauthio
|
97
|
+
licenses:
|
98
|
+
- MIT
|
99
|
+
metadata: {}
|
100
|
+
post_install_message:
|
101
|
+
rdoc_options: []
|
102
|
+
require_paths:
|
103
|
+
- lib
|
104
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
105
|
+
requirements:
|
106
|
+
- - ">="
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: '0'
|
109
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
110
|
+
requirements:
|
111
|
+
- - ">="
|
112
|
+
- !ruby/object:Gem::Version
|
113
|
+
version: '0'
|
114
|
+
requirements: []
|
115
|
+
rubyforge_project:
|
116
|
+
rubygems_version: 2.2.2
|
117
|
+
signing_key:
|
118
|
+
specification_version: 4
|
119
|
+
summary: OAuth.io Strategy for OmniAuth
|
120
|
+
test_files:
|
121
|
+
- test/helper.rb
|
122
|
+
- test/support/shared_examples.rb
|
123
|
+
- test/test.rb
|