oa-more 0.2.4 → 0.2.5
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/omniauth/more.rb +1 -0
- data/lib/omniauth/strategies/flickr.rb +9 -9
- data/lib/omniauth/strategies/windows_live.rb +2 -2
- data/lib/omniauth/strategies/windows_live/windowslivelogin.rb +84 -84
- data/lib/omniauth/strategies/yupoo.rb +67 -0
- data/lib/omniauth/version.rb +19 -0
- data/oa-more.gemspec +9 -6
- data/spec/omniauth/strategies/flickr_spec.rb +1 -1
- data/spec/spec_helper.rb +6 -7
- metadata +46 -23
- data/Gemfile +0 -3
data/lib/omniauth/more.rb
CHANGED
@@ -14,7 +14,7 @@ module OmniAuth
|
|
14
14
|
class Flickr
|
15
15
|
include OmniAuth::Strategy
|
16
16
|
attr_accessor :api_key, :secret_key, :options
|
17
|
-
|
17
|
+
|
18
18
|
# error catching, based on OAuth2 callback
|
19
19
|
class CallbackError < StandardError
|
20
20
|
attr_accessor :error, :error_reason
|
@@ -36,30 +36,30 @@ module OmniAuth
|
|
36
36
|
end
|
37
37
|
|
38
38
|
protected
|
39
|
-
|
39
|
+
|
40
40
|
def request_phase
|
41
41
|
params = { :api_key => api_key, :perms => options[:scope] }
|
42
42
|
params[:api_sig] = flickr_sign(params)
|
43
43
|
query_string = params.collect{ |key,value| "#{key}=#{Rack::Utils.escape(value)}" }.join('&')
|
44
44
|
redirect "http://flickr.com/services/auth/?#{query_string}"
|
45
45
|
end
|
46
|
-
|
46
|
+
|
47
47
|
def callback_phase
|
48
48
|
params = { :api_key => api_key, :method => 'flickr.auth.getToken', :frob => request.params['frob'], :format => 'json', :nojsoncallback => '1' }
|
49
49
|
params[:api_sig] = flickr_sign(params)
|
50
|
-
|
50
|
+
|
51
51
|
response = RestClient.get('http://api.flickr.com/services/rest/', { :params => params })
|
52
52
|
auth = MultiJson.decode(response.to_s)
|
53
53
|
raise CallbackError.new(auth['code'],auth['message']) if auth['stat'] == 'fail'
|
54
|
-
|
54
|
+
|
55
55
|
@user = auth['auth']['user']
|
56
56
|
@access_token = auth['auth']['token']['_content']
|
57
|
-
|
57
|
+
|
58
58
|
super
|
59
59
|
rescue CallbackError => e
|
60
60
|
fail!(:invalid_response, e)
|
61
61
|
end
|
62
|
-
|
62
|
+
|
63
63
|
def auth_hash
|
64
64
|
OmniAuth::Utils.deep_merge(super, {
|
65
65
|
'uid' => @user['nsid'],
|
@@ -68,7 +68,7 @@ module OmniAuth
|
|
68
68
|
'extra' => { 'user_hash' => @user }
|
69
69
|
})
|
70
70
|
end
|
71
|
-
|
71
|
+
|
72
72
|
def user_info
|
73
73
|
name = @user['fullname']
|
74
74
|
name = @user['username'] if name.nil? || name.empty?
|
@@ -77,7 +77,7 @@ module OmniAuth
|
|
77
77
|
'name' => name,
|
78
78
|
}
|
79
79
|
end
|
80
|
-
|
80
|
+
|
81
81
|
def flickr_sign(params)
|
82
82
|
Digest::MD5.hexdigest(secret_key + params.sort{|a,b| a[0].to_s <=> b[0].to_s }.flatten.join)
|
83
83
|
end
|
@@ -5,9 +5,9 @@ module OmniAuth
|
|
5
5
|
module Strategies
|
6
6
|
class WindowsLive
|
7
7
|
include OmniAuth::Strategy
|
8
|
-
|
8
|
+
|
9
9
|
attr_accessor :app_id, :app_secret
|
10
|
-
|
10
|
+
|
11
11
|
# Initialize the strategy by providing
|
12
12
|
#
|
13
13
|
# @param app_id [String] The application ID from your registered app with Microsoft.
|
@@ -1,9 +1,9 @@
|
|
1
1
|
#######################################################################
|
2
|
-
# FILE: windowslivelogin.rb
|
3
|
-
#
|
4
|
-
# DESCRIPTION: Sample implementation of Web Authentication and
|
5
|
-
# Delegated Authentication protocol in Ruby. Also
|
6
|
-
# includes trusted sign-in and application verification
|
2
|
+
# FILE: windowslivelogin.rb
|
3
|
+
#
|
4
|
+
# DESCRIPTION: Sample implementation of Web Authentication and
|
5
|
+
# Delegated Authentication protocol in Ruby. Also
|
6
|
+
# includes trusted sign-in and application verification
|
7
7
|
# sample implementations.
|
8
8
|
#
|
9
9
|
# VERSION: 1.1
|
@@ -26,7 +26,7 @@ module OmniAuth; module Strategies; class WindowsLive; class WindowsLiveLogin
|
|
26
26
|
# By default, debug information will be printed to the standard
|
27
27
|
# error output and should be visible in the web server logs.
|
28
28
|
#####################################################################
|
29
|
-
def setDebug(flag)
|
29
|
+
def setDebug(flag)
|
30
30
|
@debug = flag
|
31
31
|
end
|
32
32
|
|
@@ -39,7 +39,7 @@ module OmniAuth; module Strategies; class WindowsLive; class WindowsLiveLogin
|
|
39
39
|
return unless @debug
|
40
40
|
return if error.nil? or error.empty?
|
41
41
|
warn("Windows Live ID Authentication SDK #{error}")
|
42
|
-
nil
|
42
|
+
nil
|
43
43
|
end
|
44
44
|
|
45
45
|
#####################################################################
|
@@ -52,7 +52,7 @@ module OmniAuth; module Strategies; class WindowsLive; class WindowsLiveLogin
|
|
52
52
|
|
53
53
|
#####################################################################
|
54
54
|
# Initialize the WindowsLiveLogin module with the application ID,
|
55
|
-
# secret key, and security algorithm.
|
55
|
+
# secret key, and security algorithm.
|
56
56
|
#
|
57
57
|
# We recommend that you employ strong measures to protect the
|
58
58
|
# secret key. The secret key should never be exposed to the Web
|
@@ -65,16 +65,16 @@ module OmniAuth; module Strategies; class WindowsLive; class WindowsLiveLogin
|
|
65
65
|
# For Delegated Authentication, you may optionally specify the
|
66
66
|
# privacy policy URL and return URL. If you do not specify these
|
67
67
|
# values here, the default values that you specified when you
|
68
|
-
# registered your application will be used.
|
68
|
+
# registered your application will be used.
|
69
69
|
#
|
70
70
|
# The 'force_delauth_nonprovisioned' flag also indicates whether
|
71
|
-
# your application is registered for Delegated Authentication
|
72
|
-
# (that is, whether it uses an application ID and secret key). We
|
73
|
-
# recommend that your Delegated Authentication application always
|
71
|
+
# your application is registered for Delegated Authentication
|
72
|
+
# (that is, whether it uses an application ID and secret key). We
|
73
|
+
# recommend that your Delegated Authentication application always
|
74
74
|
# be registered for enhanced security and functionality.
|
75
75
|
#####################################################################
|
76
|
-
def initialize(appid=nil, secret=nil, securityalgorithm=nil,
|
77
|
-
force_delauth_nonprovisioned=nil,
|
76
|
+
def initialize(appid=nil, secret=nil, securityalgorithm=nil,
|
77
|
+
force_delauth_nonprovisioned=nil,
|
78
78
|
policyurl=nil, returnurl=nil)
|
79
79
|
self.force_delauth_nonprovisioned = force_delauth_nonprovisioned
|
80
80
|
self.appid = appid if appid
|
@@ -85,7 +85,7 @@ module OmniAuth; module Strategies; class WindowsLive; class WindowsLiveLogin
|
|
85
85
|
end
|
86
86
|
|
87
87
|
#####################################################################
|
88
|
-
# Initialize the WindowsLiveLogin module from a settings file.
|
88
|
+
# Initialize the WindowsLiveLogin module from a settings file.
|
89
89
|
#
|
90
90
|
# 'settingsFile' specifies the location of the XML settings file
|
91
91
|
# that contains the application ID, secret key, and security
|
@@ -102,7 +102,7 @@ module OmniAuth; module Strategies; class WindowsLive; class WindowsLiveLogin
|
|
102
102
|
# Delegated Authentication samples.
|
103
103
|
#
|
104
104
|
# We recommend that you store the WindowsLiveLogin settings file
|
105
|
-
# in an area on your server that cannot be accessed through the
|
105
|
+
# in an area on your server that cannot be accessed through the
|
106
106
|
# Internet. This file contains important confidential information.
|
107
107
|
#####################################################################
|
108
108
|
def self.initFromXml(settingsFile)
|
@@ -110,7 +110,7 @@ module OmniAuth; module Strategies; class WindowsLive; class WindowsLiveLogin
|
|
110
110
|
settings = o.parseSettings(settingsFile)
|
111
111
|
|
112
112
|
o.setDebug(settings['debug'] == 'true')
|
113
|
-
o.force_delauth_nonprovisioned =
|
113
|
+
o.force_delauth_nonprovisioned =
|
114
114
|
(settings['force_delauth_nonprovisioned'] == 'true')
|
115
115
|
|
116
116
|
o.appid = settings['appid']
|
@@ -133,7 +133,7 @@ module OmniAuth; module Strategies; class WindowsLive; class WindowsLiveLogin
|
|
133
133
|
def appid=(appid)
|
134
134
|
if (appid.nil? or appid.empty?)
|
135
135
|
return if force_delauth_nonprovisioned
|
136
|
-
fatal("Error: appid: Null application ID.")
|
136
|
+
fatal("Error: appid: Null application ID.")
|
137
137
|
end
|
138
138
|
if (not appid =~ /^\w+$/)
|
139
139
|
fatal("Error: appid: Application ID must be alpha-numeric: " + appid)
|
@@ -142,7 +142,7 @@ module OmniAuth; module Strategies; class WindowsLive; class WindowsLiveLogin
|
|
142
142
|
end
|
143
143
|
|
144
144
|
#####################################################################
|
145
|
-
# Returns the application ID.
|
145
|
+
# Returns the application ID.
|
146
146
|
#####################################################################
|
147
147
|
def appid
|
148
148
|
if (@appid.nil? or @appid.empty?)
|
@@ -158,10 +158,10 @@ module OmniAuth; module Strategies; class WindowsLive; class WindowsLiveLogin
|
|
158
158
|
def secret=(secret)
|
159
159
|
if (secret.nil? or secret.empty?)
|
160
160
|
return if force_delauth_nonprovisioned
|
161
|
-
fatal("Error: secret=: Secret must be non-null.")
|
161
|
+
fatal("Error: secret=: Secret must be non-null.")
|
162
162
|
end
|
163
163
|
if (secret.size < 16)
|
164
|
-
fatal("Error: secret=: Secret must be at least 16 characters.")
|
164
|
+
fatal("Error: secret=: Secret must be at least 16 characters.")
|
165
165
|
end
|
166
166
|
@signkey = derive(secret, "SIGNATURE")
|
167
167
|
@cryptkey = derive(secret, "ENCRYPTION")
|
@@ -171,20 +171,20 @@ module OmniAuth; module Strategies; class WindowsLive; class WindowsLiveLogin
|
|
171
171
|
# Sets your old secret key.
|
172
172
|
#
|
173
173
|
# Use this property to set your old secret key if you are in the
|
174
|
-
# process of transitioning to a new secret key. You may need this
|
175
|
-
# property because the Windows Live ID servers can take up to
|
176
|
-
# 24 hours to propagate a new secret key after you have updated
|
174
|
+
# process of transitioning to a new secret key. You may need this
|
175
|
+
# property because the Windows Live ID servers can take up to
|
176
|
+
# 24 hours to propagate a new secret key after you have updated
|
177
177
|
# your application settings.
|
178
178
|
#
|
179
179
|
# If an old secret key is specified here and has not expired
|
180
180
|
# (as determined by the oldsecretexpiry setting), it will be used
|
181
|
-
# as a fallback if token decryption fails with the new secret
|
181
|
+
# as a fallback if token decryption fails with the new secret
|
182
182
|
# key.
|
183
183
|
#####################################################################
|
184
184
|
def oldsecret=(secret)
|
185
185
|
return if (secret.nil? or secret.empty?)
|
186
186
|
if (secret.size < 16)
|
187
|
-
fatal("Error: oldsecret=: Secret must be at least 16 characters.")
|
187
|
+
fatal("Error: oldsecret=: Secret must be at least 16 characters.")
|
188
188
|
end
|
189
189
|
@oldsignkey = derive(secret, "SIGNATURE")
|
190
190
|
@oldcryptkey = derive(secret, "ENCRYPTION")
|
@@ -197,7 +197,7 @@ module OmniAuth; module Strategies; class WindowsLive; class WindowsLiveLogin
|
|
197
197
|
# used even if token decryption fails with the new secret key.
|
198
198
|
#
|
199
199
|
# The old secret expiry time is represented as the number of seconds
|
200
|
-
# elapsed since January 1, 1970.
|
200
|
+
# elapsed since January 1, 1970.
|
201
201
|
#####################################################################
|
202
202
|
def oldsecretexpiry=(timestamp)
|
203
203
|
return if (timestamp.nil? or timestamp.empty?)
|
@@ -255,10 +255,10 @@ module OmniAuth; module Strategies; class WindowsLive; class WindowsLiveLogin
|
|
255
255
|
end
|
256
256
|
|
257
257
|
#####################################################################
|
258
|
-
# Sets the return URL--the URL on your site to which the consent
|
259
|
-
# service redirects users (along with the action, consent token,
|
260
|
-
# and application context) after they have successfully provided
|
261
|
-
# consent information for Delegated Authentication. This value will
|
258
|
+
# Sets the return URL--the URL on your site to which the consent
|
259
|
+
# service redirects users (along with the action, consent token,
|
260
|
+
# and application context) after they have successfully provided
|
261
|
+
# consent information for Delegated Authentication. This value will
|
262
262
|
# override the return URL specified during registration.
|
263
263
|
#####################################################################
|
264
264
|
def returnurl=(returnurl)
|
@@ -281,7 +281,7 @@ module OmniAuth; module Strategies; class WindowsLive; class WindowsLiveLogin
|
|
281
281
|
|
282
282
|
#####################################################################
|
283
283
|
# Sets or gets the base URL to use for the Windows Live Login server. You
|
284
|
-
# should not have to change this property. Furthermore, we recommend
|
284
|
+
# should not have to change this property. Furthermore, we recommend
|
285
285
|
# that you use the Sign In control instead of the URL methods
|
286
286
|
# provided here.
|
287
287
|
#####################################################################
|
@@ -296,7 +296,7 @@ module OmniAuth; module Strategies; class WindowsLive; class WindowsLiveLogin
|
|
296
296
|
end
|
297
297
|
|
298
298
|
#####################################################################
|
299
|
-
# Sets or gets the secure (HTTPS) URL to use for the Windows Live Login
|
299
|
+
# Sets or gets the secure (HTTPS) URL to use for the Windows Live Login
|
300
300
|
# server. You should not have to change this property.
|
301
301
|
#####################################################################
|
302
302
|
attr_accessor :secureurl
|
@@ -310,7 +310,7 @@ module OmniAuth; module Strategies; class WindowsLive; class WindowsLiveLogin
|
|
310
310
|
end
|
311
311
|
|
312
312
|
#####################################################################
|
313
|
-
# Sets or gets the Consent Base URL to use for the Windows Live Consent
|
313
|
+
# Sets or gets the Consent Base URL to use for the Windows Live Consent
|
314
314
|
# server. You should not have to use or change this property directly.
|
315
315
|
#####################################################################
|
316
316
|
attr_accessor :consenturl
|
@@ -329,9 +329,9 @@ end
|
|
329
329
|
#######################################################################
|
330
330
|
class WindowsLiveLogin
|
331
331
|
#####################################################################
|
332
|
-
# Returns the sign-in URL to use for the Windows Live Login server.
|
332
|
+
# Returns the sign-in URL to use for the Windows Live Login server.
|
333
333
|
# We recommend that you use the Sign In control instead.
|
334
|
-
#
|
334
|
+
#
|
335
335
|
# If you specify it, 'context' will be returned as-is in the sign-in
|
336
336
|
# response for site-specific use.
|
337
337
|
#####################################################################
|
@@ -344,7 +344,7 @@ class WindowsLiveLogin
|
|
344
344
|
end
|
345
345
|
|
346
346
|
#####################################################################
|
347
|
-
# Returns the sign-out URL to use for the Windows Live Login server.
|
347
|
+
# Returns the sign-out URL to use for the Windows Live Login server.
|
348
348
|
# We recommend that you use the Sign In control instead.
|
349
349
|
#####################################################################
|
350
350
|
def getLogoutUrl(market=nil)
|
@@ -360,8 +360,8 @@ class WindowsLiveLogin
|
|
360
360
|
# 'id' is the pairwise unique ID for the user.
|
361
361
|
# 'context' is the application context that was originally passed to
|
362
362
|
# the sign-in request, if any.
|
363
|
-
# 'token' is the encrypted Web Authentication token that contains the
|
364
|
-
# UID. This can be cached in a cookie and the UID can be retrieved by
|
363
|
+
# 'token' is the encrypted Web Authentication token that contains the
|
364
|
+
# UID. This can be cached in a cookie and the UID can be retrieved by
|
365
365
|
# calling the processToken method.
|
366
366
|
# 'usePersistentCookie?' indicates whether the application is
|
367
367
|
# expected to store the user token in a session or persistent
|
@@ -373,8 +373,8 @@ class WindowsLiveLogin
|
|
373
373
|
def usePersistentCookie?
|
374
374
|
@usePersistentCookie
|
375
375
|
end
|
376
|
-
|
377
|
-
|
376
|
+
|
377
|
+
|
378
378
|
#####################################################################
|
379
379
|
# Initialize the User with time stamp, userid, flags, context and token.
|
380
380
|
#####################################################################
|
@@ -426,7 +426,7 @@ class WindowsLiveLogin
|
|
426
426
|
# returned by CGI.params or Rails. (The unprocessed POST string
|
427
427
|
# could also be used here but we do not recommend it).
|
428
428
|
#
|
429
|
-
# This method returns a User object on successful sign-in; otherwise
|
429
|
+
# This method returns a User object on successful sign-in; otherwise
|
430
430
|
# it returns nil.
|
431
431
|
#####################################################################
|
432
432
|
def processLogin(query)
|
@@ -446,8 +446,8 @@ class WindowsLiveLogin
|
|
446
446
|
end
|
447
447
|
|
448
448
|
#####################################################################
|
449
|
-
# Decodes and validates a Web Authentication token. Returns a User
|
450
|
-
# object on success. If a context is passed in, it will be returned
|
449
|
+
# Decodes and validates a Web Authentication token. Returns a User
|
450
|
+
# object on success. If a context is passed in, it will be returned
|
451
451
|
# as the context field in the User object.
|
452
452
|
#####################################################################
|
453
453
|
def processToken(token, context=nil)
|
@@ -467,7 +467,7 @@ class WindowsLiveLogin
|
|
467
467
|
return
|
468
468
|
end
|
469
469
|
begin
|
470
|
-
user = User.new(stoken['ts'], stoken['uid'], stoken['flags'],
|
470
|
+
user = User.new(stoken['ts'], stoken['uid'], stoken['flags'],
|
471
471
|
context, token)
|
472
472
|
return user
|
473
473
|
rescue Exception => e
|
@@ -477,10 +477,10 @@ class WindowsLiveLogin
|
|
477
477
|
end
|
478
478
|
|
479
479
|
#####################################################################
|
480
|
-
# Returns an appropriate content type and body response that the
|
481
|
-
# application handler can return to signify a successful sign-out
|
480
|
+
# Returns an appropriate content type and body response that the
|
481
|
+
# application handler can return to signify a successful sign-out
|
482
482
|
# from the application.
|
483
|
-
#
|
483
|
+
#
|
484
484
|
# When a user signs out of Windows Live or a Windows Live
|
485
485
|
# application, a best-effort attempt is made at signing the user out
|
486
486
|
# from all other Windows Live applications the user might be signed
|
@@ -511,7 +511,7 @@ class WindowsLiveLogin
|
|
511
511
|
# If you specify it, 'context' will be returned as-is in the consent
|
512
512
|
# response for site-specific use.
|
513
513
|
#
|
514
|
-
# The registered/configured return URL can also be overridden by
|
514
|
+
# The registered/configured return URL can also be overridden by
|
515
515
|
# specifying 'ru' here.
|
516
516
|
#
|
517
517
|
# You can change the language in which the consent page is displayed
|
@@ -534,9 +534,9 @@ class WindowsLiveLogin
|
|
534
534
|
end
|
535
535
|
|
536
536
|
#####################################################################
|
537
|
-
# Returns the URL to use to download a new consent token, given the
|
537
|
+
# Returns the URL to use to download a new consent token, given the
|
538
538
|
# offers and refresh token.
|
539
|
-
# The registered/configured return URL can also be overridden by
|
539
|
+
# The registered/configured return URL can also be overridden by
|
540
540
|
# specifying 'ru' here.
|
541
541
|
#####################################################################
|
542
542
|
def getRefreshConsentTokenUrl(offers, refreshtoken, ru)
|
@@ -546,7 +546,7 @@ class WindowsLiveLogin
|
|
546
546
|
if (refreshtoken.nil? or refreshtoken.empty?)
|
547
547
|
fatal("Error: getRefreshConsentTokenUrl: Invalid refresh token.")
|
548
548
|
end
|
549
|
-
url = consenturl + "RefreshToken.aspx?ps=#{CGI.escape(offers)}"
|
549
|
+
url = consenturl + "RefreshToken.aspx?ps=#{CGI.escape(offers)}"
|
550
550
|
url += "&reft=#{refreshtoken}"
|
551
551
|
ru = returnurl if (ru.nil? or ru.empty?)
|
552
552
|
url += "&ru=#{CGI.escape(ru)}" if ru
|
@@ -578,9 +578,9 @@ class WindowsLiveLogin
|
|
578
578
|
return false unless delegationtoken
|
579
579
|
return ((Time.now.to_i-300) < expiry.to_i)
|
580
580
|
end
|
581
|
-
|
581
|
+
|
582
582
|
#####################################################################
|
583
|
-
# Refreshes the current token and replace it. If operation succeeds
|
583
|
+
# Refreshes the current token and replace it. If operation succeeds
|
584
584
|
# true is returned to signify success.
|
585
585
|
#####################################################################
|
586
586
|
def refresh
|
@@ -591,9 +591,9 @@ class WindowsLiveLogin
|
|
591
591
|
end
|
592
592
|
|
593
593
|
#####################################################################
|
594
|
-
# Initialize the ConsentToken module with the WindowsLiveLogin,
|
595
|
-
# delegation token, refresh token, session key, expiry, offers,
|
596
|
-
# location ID, context, decoded token, and raw token.
|
594
|
+
# Initialize the ConsentToken module with the WindowsLiveLogin,
|
595
|
+
# delegation token, refresh token, session key, expiry, offers,
|
596
|
+
# location ID, context, decoded token, and raw token.
|
597
597
|
#####################################################################
|
598
598
|
def initialize(wll, delegationtoken, refreshtoken, sessionkey, expiry,
|
599
599
|
offers, locationid, context, decodedtoken, token)
|
@@ -608,7 +608,7 @@ class WindowsLiveLogin
|
|
608
608
|
self.decodedtoken = decodedtoken
|
609
609
|
self.token = token
|
610
610
|
end
|
611
|
-
|
611
|
+
|
612
612
|
private
|
613
613
|
attr_writer :delegationtoken, :refreshtoken, :sessionkey, :expiry
|
614
614
|
attr_writer :offers, :offers_string, :locationid, :context
|
@@ -619,7 +619,7 @@ class WindowsLiveLogin
|
|
619
619
|
#####################################################################
|
620
620
|
def delegationtoken=(delegationtoken)
|
621
621
|
if (delegationtoken.nil? or delegationtoken.empty?)
|
622
|
-
raise("Error: ConsentToken: Null delegation token.")
|
622
|
+
raise("Error: ConsentToken: Null delegation token.")
|
623
623
|
end
|
624
624
|
@delegationtoken = delegationtoken
|
625
625
|
end
|
@@ -694,10 +694,10 @@ class WindowsLiveLogin
|
|
694
694
|
end
|
695
695
|
|
696
696
|
#####################################################################
|
697
|
-
# Processes the POST response from the Delegated Authentication
|
697
|
+
# Processes the POST response from the Delegated Authentication
|
698
698
|
# service after a user has granted consent. The processConsent
|
699
|
-
# function extracts the consent token string and returns the result
|
700
|
-
# of invoking the processConsentToken method.
|
699
|
+
# function extracts the consent token string and returns the result
|
700
|
+
# of invoking the processConsentToken method.
|
701
701
|
#####################################################################
|
702
702
|
def processConsent(query)
|
703
703
|
query = parse query
|
@@ -721,8 +721,8 @@ class WindowsLiveLogin
|
|
721
721
|
end
|
722
722
|
|
723
723
|
#####################################################################
|
724
|
-
# Processes the consent token string that is returned in the POST
|
725
|
-
# response by the Delegated Authentication service after a
|
724
|
+
# Processes the consent token string that is returned in the POST
|
725
|
+
# response by the Delegated Authentication service after a
|
726
726
|
# user has granted consent.
|
727
727
|
#####################################################################
|
728
728
|
def processConsentToken(token, context=nil)
|
@@ -747,7 +747,7 @@ class WindowsLiveLogin
|
|
747
747
|
decodedtoken = CGI.escape(decodedtoken)
|
748
748
|
end
|
749
749
|
begin
|
750
|
-
consenttoken = ConsentToken.new(self,
|
750
|
+
consenttoken = ConsentToken.new(self,
|
751
751
|
parsedtoken['delt'],
|
752
752
|
parsedtoken['reft'],
|
753
753
|
parsedtoken['skey'],
|
@@ -763,7 +763,7 @@ class WindowsLiveLogin
|
|
763
763
|
end
|
764
764
|
|
765
765
|
#####################################################################
|
766
|
-
# Attempts to obtain a new, refreshed token and return it. The
|
766
|
+
# Attempts to obtain a new, refreshed token and return it. The
|
767
767
|
# original token is not modified.
|
768
768
|
#####################################################################
|
769
769
|
def refreshConsentToken(consenttoken, ru=nil)
|
@@ -853,7 +853,7 @@ class WindowsLiveLogin
|
|
853
853
|
end
|
854
854
|
|
855
855
|
#####################################################################
|
856
|
-
# Creates a signature for the given string by using the signature
|
856
|
+
# Creates a signature for the given string by using the signature
|
857
857
|
# key.
|
858
858
|
#####################################################################
|
859
859
|
def signToken(token, signkey=@signkey)
|
@@ -890,12 +890,12 @@ class WindowsLiveLogin
|
|
890
890
|
end
|
891
891
|
|
892
892
|
#######################################################################
|
893
|
-
# Implementation of the methods needed to perform Windows Live
|
893
|
+
# Implementation of the methods needed to perform Windows Live
|
894
894
|
# application verification as well as trusted sign-in.
|
895
895
|
#######################################################################
|
896
896
|
class WindowsLiveLogin
|
897
897
|
#####################################################################
|
898
|
-
# Generates an application verifier token. An IP address can
|
898
|
+
# Generates an application verifier token. An IP address can
|
899
899
|
# optionally be included in the token.
|
900
900
|
#####################################################################
|
901
901
|
def getAppVerifier(ip=nil)
|
@@ -906,16 +906,16 @@ class WindowsLiveLogin
|
|
906
906
|
end
|
907
907
|
|
908
908
|
#####################################################################
|
909
|
-
# Returns the URL that is required to retrieve the application
|
909
|
+
# Returns the URL that is required to retrieve the application
|
910
910
|
# security token.
|
911
911
|
#
|
912
|
-
# By default, the application security token is generated for
|
913
|
-
# the Windows Live site; a specific Site ID can optionally be
|
914
|
-
# specified in 'siteid'. The IP address can also optionally be
|
912
|
+
# By default, the application security token is generated for
|
913
|
+
# the Windows Live site; a specific Site ID can optionally be
|
914
|
+
# specified in 'siteid'. The IP address can also optionally be
|
915
915
|
# included in 'ip'.
|
916
916
|
#
|
917
|
-
# If 'js' is nil, a JavaScript Output Notation (JSON) response is
|
918
|
-
# returned in the following format:
|
917
|
+
# If 'js' is nil, a JavaScript Output Notation (JSON) response is
|
918
|
+
# returned in the following format:
|
919
919
|
#
|
920
920
|
# {"token":"<value>"}
|
921
921
|
#
|
@@ -935,7 +935,7 @@ class WindowsLiveLogin
|
|
935
935
|
|
936
936
|
#####################################################################
|
937
937
|
# Retrieves the application security token for application
|
938
|
-
# verification from the application sign-in URL.
|
938
|
+
# verification from the application sign-in URL.
|
939
939
|
#
|
940
940
|
# By default, the application security token will be generated for
|
941
941
|
# the Windows Live site; a specific Site ID can optionally be
|
@@ -962,7 +962,7 @@ class WindowsLiveLogin
|
|
962
962
|
debug("Error: getAppSecurityToken: Failed to extract token: #{body}")
|
963
963
|
rescue Exception => e
|
964
964
|
debug("Error: getAppSecurityToken: Failed to get token: #{e}")
|
965
|
-
end
|
965
|
+
end
|
966
966
|
return
|
967
967
|
end
|
968
968
|
|
@@ -983,13 +983,13 @@ class WindowsLiveLogin
|
|
983
983
|
# may have to be escaped if you are inserting them in code such as
|
984
984
|
# an HTML form.
|
985
985
|
#
|
986
|
-
# The user to be trusted on the local site is passed in as string
|
986
|
+
# The user to be trusted on the local site is passed in as string
|
987
987
|
# 'user'.
|
988
988
|
#
|
989
989
|
# Optionally, 'retcode' specifies the resource to which successful
|
990
990
|
# sign-in is redirected, such as Windows Live Mail, and is typically
|
991
991
|
# a string in the format 'id=2000'. If you pass in the value from
|
992
|
-
# getAppRetCode instead, sign-in will be redirected to the
|
992
|
+
# getAppRetCode instead, sign-in will be redirected to the
|
993
993
|
# application. Otherwise, an HTTP 200 response is returned.
|
994
994
|
#####################################################################
|
995
995
|
def getTrustedParams(user, retcode=nil)
|
@@ -1022,7 +1022,7 @@ class WindowsLiveLogin
|
|
1022
1022
|
|
1023
1023
|
#####################################################################
|
1024
1024
|
# Returns the trusted sign-in URL to use for the Windows Live Login
|
1025
|
-
# server.
|
1025
|
+
# server.
|
1026
1026
|
#####################################################################
|
1027
1027
|
def getTrustedLoginUrl
|
1028
1028
|
secureurl + "wlogin.srf"
|
@@ -1041,10 +1041,10 @@ end
|
|
1041
1041
|
# Helper methods.
|
1042
1042
|
#######################################################################
|
1043
1043
|
class WindowsLiveLogin
|
1044
|
-
|
1044
|
+
|
1045
1045
|
#######################################################################
|
1046
1046
|
# Function to parse the settings file.
|
1047
|
-
#######################################################################
|
1047
|
+
#######################################################################
|
1048
1048
|
def parseSettings(settingsFile)
|
1049
1049
|
settings = {}
|
1050
1050
|
begin
|
@@ -1077,12 +1077,12 @@ class WindowsLiveLogin
|
|
1077
1077
|
end
|
1078
1078
|
|
1079
1079
|
#####################################################################
|
1080
|
-
# Parses query string and return a table
|
1080
|
+
# Parses query string and return a table
|
1081
1081
|
# {String=>String}
|
1082
1082
|
#
|
1083
1083
|
# If a table is passed in from CGI.params, we convert it from
|
1084
1084
|
# {String=>[]} to {String=>String}. I believe Rails uses symbols
|
1085
|
-
# instead of strings in general, so we convert from symbols to
|
1085
|
+
# instead of strings in general, so we convert from symbols to
|
1086
1086
|
# strings here also.
|
1087
1087
|
#####################################################################
|
1088
1088
|
def parse(input)
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'omniauth/core'
|
2
|
+
require 'digest/md5'
|
3
|
+
require 'rest-client'
|
4
|
+
require 'multi_json'
|
5
|
+
|
6
|
+
module OmniAuth
|
7
|
+
module Strategies
|
8
|
+
class Yupoo
|
9
|
+
include OmniAuth::Strategy
|
10
|
+
attr_accessor :api_key, :secret_key, :options
|
11
|
+
|
12
|
+
|
13
|
+
class CallbackError < StandardError
|
14
|
+
attr_accessor :error, :error_reason
|
15
|
+
def initialize(error, error_reason)
|
16
|
+
self.error = error
|
17
|
+
self.error_reason = error_reason
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def initialize(app, api_key, secret_key, options = {})
|
22
|
+
super(app, :yupoo)
|
23
|
+
@api_key = api_key
|
24
|
+
@secret_key = secret_key
|
25
|
+
@options = {:scope => 'read'}.merge(options)
|
26
|
+
end
|
27
|
+
|
28
|
+
protected
|
29
|
+
|
30
|
+
def request_phase
|
31
|
+
params = { :api_key => api_key, :perms => options[:scope] }
|
32
|
+
params[:api_sig] = yupoo_sign(params)
|
33
|
+
query_string = params.collect{ |key,value| "#{key}=#{Rack::Utils.escape(value)}" }.join('&')
|
34
|
+
redirect "http://www.yupoo.com/services/auth/?#{query_string}"
|
35
|
+
end
|
36
|
+
|
37
|
+
def callback_phase
|
38
|
+
params = { :api_key => api_key, :method => 'yupoo.auth.getToken', :frob => request.params['frob'], :format => 'json', :nojsoncallback => '1' }
|
39
|
+
params[:api_sig] = yupoo_sign(params)
|
40
|
+
|
41
|
+
response = RestClient.get('http://www.yupoo.com/api/rest/', { :params => params })
|
42
|
+
auth = MultiJson.decode(response.to_s)
|
43
|
+
raise CallbackError.new(auth['code'],auth['message']) if auth['stat'] == 'fail'
|
44
|
+
|
45
|
+
@user = auth['auth']['user']
|
46
|
+
@access_token = auth['auth']['token']['_content']
|
47
|
+
|
48
|
+
super
|
49
|
+
rescue CallbackError => e
|
50
|
+
fail!(:invalid_response, e)
|
51
|
+
end
|
52
|
+
|
53
|
+
def auth_hash
|
54
|
+
OmniAuth::Utils.deep_merge(super, {
|
55
|
+
'uid' => @user['nsid'],
|
56
|
+
'credentials' => { 'token' => @access_token },
|
57
|
+
'user_info' => @user,
|
58
|
+
'extra' => { 'user_hash' => @user }
|
59
|
+
})
|
60
|
+
end
|
61
|
+
|
62
|
+
def yupoo_sign(params)
|
63
|
+
Digest::MD5.hexdigest(secret_key + params.sort{|a,b| a[0].to_s <=> b[0].to_s }.flatten.join)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module OmniAuth
|
2
|
+
module Version
|
3
|
+
unless defined?(::OmniAuth::Version::MAJOR)
|
4
|
+
MAJOR = 0
|
5
|
+
end
|
6
|
+
unless defined?(::OmniAuth::Version::MINOR)
|
7
|
+
MINOR = 2
|
8
|
+
end
|
9
|
+
unless defined?(::OmniAuth::Version::PATCH)
|
10
|
+
PATCH = 5
|
11
|
+
end
|
12
|
+
unless defined?(::OmniAuth::Version::PRE)
|
13
|
+
PRE = nil
|
14
|
+
end
|
15
|
+
unless defined?(::OmniAuth::Version::STRING)
|
16
|
+
STRING = [MAJOR, MINOR, PATCH, PRE].compact.join('.')
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/oa-more.gemspec
CHANGED
@@ -1,21 +1,24 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
require File.expand_path('
|
2
|
+
require File.expand_path('../lib/omniauth/version', __FILE__)
|
3
3
|
|
4
4
|
Gem::Specification.new do |gem|
|
5
|
-
gem.
|
6
|
-
gem.
|
7
|
-
gem.
|
5
|
+
gem.add_runtime_dependency 'jruby-openssl', '~> 0.7.3' if RUBY_PLATFORM == 'java'
|
6
|
+
gem.add_runtime_dependency 'multi_json', '~> 1.0.0'
|
7
|
+
gem.add_runtime_dependency 'oa-core', OmniAuth::Version::STRING
|
8
|
+
gem.add_runtime_dependency 'rest-client', '~> 1.6.0'
|
8
9
|
gem.add_development_dependency 'json_pure', '~> 1.5'
|
10
|
+
gem.add_development_dependency 'maruku', '~> 0.6'
|
9
11
|
gem.add_development_dependency 'rake', '~> 0.8'
|
10
12
|
gem.add_development_dependency 'rack-test', '~> 0.5'
|
11
13
|
gem.add_development_dependency 'rspec', '~> 2.5'
|
12
14
|
gem.add_development_dependency 'simplecov', '~> 0.4'
|
13
15
|
gem.add_development_dependency 'webmock', '~> 1.6'
|
14
16
|
gem.add_development_dependency 'yard', '~> 0.6'
|
17
|
+
gem.add_development_dependency 'ZenTest', '~> 4.5'
|
15
18
|
gem.name = 'oa-more'
|
16
|
-
gem.version =
|
17
|
-
gem.summary = %q{Additional strategies for OmniAuth.}
|
19
|
+
gem.version = OmniAuth::Version::STRING
|
18
20
|
gem.description = %q{Additional strategies for OmniAuth.}
|
21
|
+
gem.summary = gem.description
|
19
22
|
gem.email = 'michael@intridea.com'
|
20
23
|
gem.homepage = 'http://github.com/intridea/omniauth'
|
21
24
|
gem.authors = ['Michael Bleigh', 'Erik Michaels-Ober']
|
data/spec/spec_helper.rb
CHANGED
@@ -1,12 +1,11 @@
|
|
1
|
-
require '
|
1
|
+
require 'simplecov'
|
2
|
+
SimpleCov.start
|
2
3
|
require 'rspec'
|
3
|
-
require 'rspec/autorun'
|
4
4
|
require 'rack/test'
|
5
5
|
require 'webmock/rspec'
|
6
|
-
|
7
|
-
include Rack::Test::Methods
|
8
|
-
include WebMock::API
|
9
|
-
|
10
6
|
require 'omniauth/more'
|
11
7
|
|
12
|
-
|
8
|
+
Rspec.configure do |config|
|
9
|
+
config.include Rack::Test::Methods
|
10
|
+
config.include WebMock::API
|
11
|
+
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: oa-more
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.2.
|
5
|
+
version: 0.2.5
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Michael Bleigh
|
@@ -11,39 +11,39 @@ autorequire:
|
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
13
|
|
14
|
-
date: 2011-04-
|
14
|
+
date: 2011-04-29 00:00:00 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
|
-
name:
|
17
|
+
name: multi_json
|
18
18
|
prerelease: false
|
19
19
|
requirement: &id001 !ruby/object:Gem::Requirement
|
20
20
|
none: false
|
21
21
|
requirements:
|
22
|
-
- -
|
22
|
+
- - ~>
|
23
23
|
- !ruby/object:Gem::Version
|
24
|
-
version: 0.
|
24
|
+
version: 1.0.0
|
25
25
|
type: :runtime
|
26
26
|
version_requirements: *id001
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: oa-core
|
29
29
|
prerelease: false
|
30
30
|
requirement: &id002 !ruby/object:Gem::Requirement
|
31
31
|
none: false
|
32
32
|
requirements:
|
33
|
-
- -
|
33
|
+
- - "="
|
34
34
|
- !ruby/object:Gem::Version
|
35
|
-
version:
|
35
|
+
version: 0.2.5
|
36
36
|
type: :runtime
|
37
37
|
version_requirements: *id002
|
38
38
|
- !ruby/object:Gem::Dependency
|
39
|
-
name:
|
39
|
+
name: rest-client
|
40
40
|
prerelease: false
|
41
41
|
requirement: &id003 !ruby/object:Gem::Requirement
|
42
42
|
none: false
|
43
43
|
requirements:
|
44
44
|
- - ~>
|
45
45
|
- !ruby/object:Gem::Version
|
46
|
-
version:
|
46
|
+
version: 1.6.0
|
47
47
|
type: :runtime
|
48
48
|
version_requirements: *id003
|
49
49
|
- !ruby/object:Gem::Dependency
|
@@ -58,71 +58,93 @@ dependencies:
|
|
58
58
|
type: :development
|
59
59
|
version_requirements: *id004
|
60
60
|
- !ruby/object:Gem::Dependency
|
61
|
-
name:
|
61
|
+
name: maruku
|
62
62
|
prerelease: false
|
63
63
|
requirement: &id005 !ruby/object:Gem::Requirement
|
64
64
|
none: false
|
65
65
|
requirements:
|
66
66
|
- - ~>
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: "0.
|
68
|
+
version: "0.6"
|
69
69
|
type: :development
|
70
70
|
version_requirements: *id005
|
71
71
|
- !ruby/object:Gem::Dependency
|
72
|
-
name:
|
72
|
+
name: rake
|
73
73
|
prerelease: false
|
74
74
|
requirement: &id006 !ruby/object:Gem::Requirement
|
75
75
|
none: false
|
76
76
|
requirements:
|
77
77
|
- - ~>
|
78
78
|
- !ruby/object:Gem::Version
|
79
|
-
version: "0.
|
79
|
+
version: "0.8"
|
80
80
|
type: :development
|
81
81
|
version_requirements: *id006
|
82
82
|
- !ruby/object:Gem::Dependency
|
83
|
-
name:
|
83
|
+
name: rack-test
|
84
84
|
prerelease: false
|
85
85
|
requirement: &id007 !ruby/object:Gem::Requirement
|
86
86
|
none: false
|
87
87
|
requirements:
|
88
88
|
- - ~>
|
89
89
|
- !ruby/object:Gem::Version
|
90
|
-
version: "
|
90
|
+
version: "0.5"
|
91
91
|
type: :development
|
92
92
|
version_requirements: *id007
|
93
93
|
- !ruby/object:Gem::Dependency
|
94
|
-
name:
|
94
|
+
name: rspec
|
95
95
|
prerelease: false
|
96
96
|
requirement: &id008 !ruby/object:Gem::Requirement
|
97
97
|
none: false
|
98
98
|
requirements:
|
99
99
|
- - ~>
|
100
100
|
- !ruby/object:Gem::Version
|
101
|
-
version: "
|
101
|
+
version: "2.5"
|
102
102
|
type: :development
|
103
103
|
version_requirements: *id008
|
104
104
|
- !ruby/object:Gem::Dependency
|
105
|
-
name:
|
105
|
+
name: simplecov
|
106
106
|
prerelease: false
|
107
107
|
requirement: &id009 !ruby/object:Gem::Requirement
|
108
108
|
none: false
|
109
109
|
requirements:
|
110
110
|
- - ~>
|
111
111
|
- !ruby/object:Gem::Version
|
112
|
-
version: "
|
112
|
+
version: "0.4"
|
113
113
|
type: :development
|
114
114
|
version_requirements: *id009
|
115
115
|
- !ruby/object:Gem::Dependency
|
116
|
-
name:
|
116
|
+
name: webmock
|
117
117
|
prerelease: false
|
118
118
|
requirement: &id010 !ruby/object:Gem::Requirement
|
119
119
|
none: false
|
120
120
|
requirements:
|
121
121
|
- - ~>
|
122
122
|
- !ruby/object:Gem::Version
|
123
|
-
version: "
|
123
|
+
version: "1.6"
|
124
124
|
type: :development
|
125
125
|
version_requirements: *id010
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: yard
|
128
|
+
prerelease: false
|
129
|
+
requirement: &id011 !ruby/object:Gem::Requirement
|
130
|
+
none: false
|
131
|
+
requirements:
|
132
|
+
- - ~>
|
133
|
+
- !ruby/object:Gem::Version
|
134
|
+
version: "0.6"
|
135
|
+
type: :development
|
136
|
+
version_requirements: *id011
|
137
|
+
- !ruby/object:Gem::Dependency
|
138
|
+
name: ZenTest
|
139
|
+
prerelease: false
|
140
|
+
requirement: &id012 !ruby/object:Gem::Requirement
|
141
|
+
none: false
|
142
|
+
requirements:
|
143
|
+
- - ~>
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: "4.5"
|
146
|
+
type: :development
|
147
|
+
version_requirements: *id012
|
126
148
|
description: Additional strategies for OmniAuth.
|
127
149
|
email: michael@intridea.com
|
128
150
|
executables: []
|
@@ -135,7 +157,6 @@ files:
|
|
135
157
|
- .gemtest
|
136
158
|
- .rspec
|
137
159
|
- .yardopts
|
138
|
-
- Gemfile
|
139
160
|
- LICENSE
|
140
161
|
- README.rdoc
|
141
162
|
- Rakefile
|
@@ -144,6 +165,8 @@ files:
|
|
144
165
|
- lib/omniauth/strategies/flickr.rb
|
145
166
|
- lib/omniauth/strategies/windows_live.rb
|
146
167
|
- lib/omniauth/strategies/windows_live/windowslivelogin.rb
|
168
|
+
- lib/omniauth/strategies/yupoo.rb
|
169
|
+
- lib/omniauth/version.rb
|
147
170
|
- oa-more.gemspec
|
148
171
|
- spec/omniauth/strategies/flickr_spec.rb
|
149
172
|
- spec/spec_helper.rb
|
data/Gemfile
DELETED