oa-more 0.2.4 → 0.2.5
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.
- 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