omniauth_china 0.0.6 → 0.0.7
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/Gemfile.lock +3 -13
- data/README.markdown +3 -18
- data/lib/omniauth_china/strategies/renren.rb +59 -28
- data/lib/omniauth_china/strategies/renren/session.rb +4 -25
- data/lib/omniauth_china/version.rb +1 -1
- data/spec/omniauth_china/strategies/renren_spec.rb +5 -0
- metadata +5 -4
- data/lib/omniauth_china/strategies/renren/helper.rb +0 -141
data/Gemfile.lock
CHANGED
@@ -1,13 +1,9 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
omniauth_china (0.0.
|
5
|
-
|
6
|
-
|
7
|
-
oa-core (~> 0.2.0.beta1)
|
8
|
-
oa-oauth (~> 0.2.0.beta1)
|
9
|
-
oauth (~> 0.4.0)
|
10
|
-
oauth2 (~> 0.1.0)
|
4
|
+
omniauth_china (0.0.6)
|
5
|
+
oa-core (~> 0.2.0)
|
6
|
+
oa-oauth (~> 0.2.0)
|
11
7
|
|
12
8
|
GEM
|
13
9
|
remote: http://rubygems.org/
|
@@ -145,12 +141,6 @@ DEPENDENCIES
|
|
145
141
|
capybara (>= 0.4.0)
|
146
142
|
json (~> 1.4.3)
|
147
143
|
mg (~> 0.0.8)
|
148
|
-
multi_json (~> 0.0.2)
|
149
|
-
nokogiri (~> 1.4.2)
|
150
|
-
oa-core (~> 0.2.0.beta1)
|
151
|
-
oa-oauth (~> 0.2.0.beta1)
|
152
|
-
oauth (~> 0.4.0)
|
153
|
-
oauth2 (~> 0.1.0)
|
154
144
|
omniauth_china!
|
155
145
|
rack
|
156
146
|
rack-test (~> 0.5.4)
|
data/README.markdown
CHANGED
@@ -22,22 +22,11 @@ OmniAuth currently supports the following external providers:
|
|
22
22
|
* T163 (credit: [he9qi](http://github.com/he9qi))
|
23
23
|
* Tsohu (credit: [he9qi](http://github.com/he9qi))
|
24
24
|
* Tqq (credit: [he9qi](http://github.com/he9qi))
|
25
|
-
* Renren (
|
25
|
+
* Renren (credit: [taweili](http://github.com/taweili), [rainux](http://github.com/rainux), [he9qi](http://github.com/he9qi))
|
26
26
|
|
27
|
-
## 人人([taweili](http://github.com/taweili), [rainux](http://github.com/rainux))
|
27
|
+
## 人人([taweili](http://github.com/taweili), [rainux](http://github.com/rainux), [he9qi](http://github.com/he9qi))
|
28
28
|
|
29
|
-
|
30
|
-
|
31
|
-
rails g omniauth_renren:install
|
32
|
-
|
33
|
-
Place the Renren Connect button on any page by simply call `omniauth_renren_connect_button` and `omniauth_renren_javascript`:
|
34
|
-
|
35
|
-
<%= omniauth_renren_connect_button %>
|
36
|
-
<%= omniauth_renren_javascript %>
|
37
|
-
|
38
|
-
Route `/auth/renren` to the page that contain Renren Connect button:
|
39
|
-
|
40
|
-
match '/auth/renren' => 'users#show'
|
29
|
+
人人 uses Oauth 2.0 now, however, As of right now, 人人still needs session key to get more user information besides uid [see here](http://wiki.dev.renren.com/wiki/%E8%8E%B7%E5%8F%96%E4%BA%BA%E4%BA%BA%E7%BD%91%E8%B5%84%E6%BA%90), so we still need `session.rb` and `service.rb` if we want more user information. Hopefully this will change soon in the future.
|
41
30
|
|
42
31
|
## Usage
|
43
32
|
|
@@ -69,7 +58,3 @@ The `user_info` hash will automatically be populated with as much information ab
|
|
69
58
|
## Contributors (thanks!)
|
70
59
|
* [huacnlee](http://github.com/huacnlee)
|
71
60
|
|
72
|
-
|
73
|
-
## TODO
|
74
|
-
|
75
|
-
Write better tests!!
|
@@ -1,48 +1,79 @@
|
|
1
|
-
require '
|
1
|
+
require 'omniauth/oauth'
|
2
|
+
require 'multi_json'
|
2
3
|
|
3
4
|
module OmniAuth
|
4
5
|
module Strategies
|
5
|
-
|
6
|
-
|
6
|
+
|
7
|
+
# Authenticate to Renren utilizing OAuth 2.0 and retrieve
|
8
|
+
# basic user information.
|
9
|
+
#
|
10
|
+
# @example Basic Usage
|
11
|
+
# use OmniAuth::Strategies::Renren, 'client_id', 'client_secret'
|
12
|
+
class Renren < OAuth2
|
7
13
|
autoload :Session, 'omniauth_china/strategies/renren/session'
|
8
14
|
autoload :Service, 'omniauth_china/strategies/renren/service'
|
9
|
-
|
10
|
-
|
15
|
+
|
11
16
|
class << self
|
12
|
-
def api_key
|
13
|
-
|
14
|
-
end
|
15
|
-
|
16
|
-
def secret_key
|
17
|
-
@@secret_key
|
18
|
-
end
|
17
|
+
def api_key; @@api_key; end
|
18
|
+
def secret_key; @@secret_key; end
|
19
19
|
end
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
20
|
+
|
21
|
+
# @param [Rack Application] app standard middleware application parameter
|
22
|
+
# @param [String] client_id the application id as [registered on Renren](http://www.renren.com/developers/)
|
23
|
+
# @param [String] client_secret the application secret as registered on Renren
|
24
|
+
# @option options [String] :scope ('email') comma-separated extended permissions such as `email` and `manage_pages`
|
25
|
+
def initialize(app, client_id = nil, client_secret = nil, options = {}, &block)
|
26
|
+
@@api_key = client_id
|
27
|
+
@@secret_key = client_secret
|
28
|
+
super(app, :renren, client_id, client_secret, {:site => 'https://graph.renren.com/', :access_token_path => "/oauth/token"}, options, &block)
|
26
29
|
end
|
27
|
-
|
30
|
+
|
31
|
+
def user_hash
|
32
|
+
@data ||= MultiJson.decode(@access_token.get('/renren_api/session_key', { :oauth_token => @access_token.token }, { "Accept-Language" => "zh;"}))
|
33
|
+
@renren_session ||= Renren::Session.new(@data)
|
34
|
+
end
|
35
|
+
|
28
36
|
def request_phase
|
29
|
-
|
37
|
+
options[:scope] ||= "email"
|
38
|
+
options[:response_type] ||= "code"
|
39
|
+
super
|
30
40
|
end
|
31
|
-
|
41
|
+
|
42
|
+
# need to have :grant_type=>"authorization_code" for renren to work
|
32
43
|
def callback_phase
|
33
|
-
|
34
|
-
|
44
|
+
if request.params['error'] || request.params['error_reason']
|
45
|
+
raise CallbackError.new(request.params['error'], request.params['error_description'] || request.params['error_reason'], request.params['error_uri'])
|
46
|
+
end
|
47
|
+
verifier = request.params['code']
|
48
|
+
@access_token = client.web_server.get_access_token(verifier, {:redirect_uri => callback_url, :grant_type=>"authorization_code" })
|
49
|
+
@env['omniauth.auth'] = auth_hash
|
50
|
+
call_app!
|
51
|
+
rescue ::OAuth2::HTTPError, ::OAuth2::AccessDenied, CallbackError => e
|
52
|
+
fail!(:invalid_credentials, e)
|
35
53
|
end
|
36
|
-
|
54
|
+
|
37
55
|
def auth_hash
|
38
56
|
OmniAuth::Utils.deep_merge(super, {
|
39
|
-
'uid' =>
|
40
|
-
'user_info' =>
|
57
|
+
'uid' => user_hash.uid,
|
58
|
+
'user_info' => user_info,
|
41
59
|
'extra' => {
|
42
|
-
'
|
60
|
+
'user_hash' => user_hash.user
|
43
61
|
}
|
44
62
|
})
|
45
63
|
end
|
64
|
+
|
65
|
+
def user_info
|
66
|
+
user_hash = self.user_hash.user
|
67
|
+
{
|
68
|
+
'username' => user_hash['name'],
|
69
|
+
'name' => user_hash['name'],
|
70
|
+
'image' => user_hash['tinyurl'],
|
71
|
+
'vip' => user_hash['vip'],
|
72
|
+
'headurl' => user_hash['headurl']
|
73
|
+
}
|
74
|
+
end
|
75
|
+
|
46
76
|
end
|
77
|
+
|
47
78
|
end
|
48
|
-
end
|
79
|
+
end
|
@@ -13,11 +13,10 @@ module OmniAuth
|
|
13
13
|
attr_reader :expires
|
14
14
|
attr_reader :uid
|
15
15
|
|
16
|
-
def initialize(
|
17
|
-
|
18
|
-
@
|
19
|
-
@
|
20
|
-
@uid = options['user']
|
16
|
+
def initialize(user_hash)
|
17
|
+
@expires = user_hash['renren_token']['expires_in'] ? user_hash['renren_token']['expires_in'].to_i : 0
|
18
|
+
@session_key = user_hash['renren_token']['session_key']
|
19
|
+
@uid = user_hash['user']['id']
|
21
20
|
end
|
22
21
|
|
23
22
|
def user
|
@@ -65,26 +64,6 @@ module OmniAuth
|
|
65
64
|
end
|
66
65
|
|
67
66
|
private
|
68
|
-
def extract_renren_cookies(cookies)
|
69
|
-
parsed = {}
|
70
|
-
xn_cookie_names(cookies).each { |key| parsed[key[xn_cookie_prefix.size, key.size]] = cookies[key] }
|
71
|
-
|
72
|
-
# #returning gracefully if the cookies aren't set or have expired
|
73
|
-
# return unless parsed['session_key'] && parsed['user'] && parsed['expires'] && parsed['ss']
|
74
|
-
# # TODO: check expires, why it alway less than Time.now
|
75
|
-
# return unless (Time.at(parsed['expires'].to_s.to_f) > Time.now) || (parsed['expires'] == "0")
|
76
|
-
# #if we have the unexpired cookies, we'll throw an exception if the sig doesn't verify
|
77
|
-
verify_signature(parsed, cookies[Renren.api_key])
|
78
|
-
parsed
|
79
|
-
end
|
80
|
-
|
81
|
-
def xn_cookie_names(cookies)
|
82
|
-
xn_cookie_names = cookies.keys.select {|k| k && k.starts_with?(xn_cookie_prefix) }
|
83
|
-
end
|
84
|
-
|
85
|
-
def xn_cookie_prefix
|
86
|
-
Renren.api_key + '_'
|
87
|
-
end
|
88
67
|
|
89
68
|
def verify_signature(renren_sig_params, expected_signature)
|
90
69
|
self.class.send :verify_signature, renren_sig_params, expected_signature
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 7
|
9
|
+
version: 0.0.7
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Qi He
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-
|
17
|
+
date: 2011-04-26 00:00:00 -07:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -69,7 +69,6 @@ files:
|
|
69
69
|
- lib/omniauth_china/oauth_china.rb
|
70
70
|
- lib/omniauth_china/strategies/douban.rb
|
71
71
|
- lib/omniauth_china/strategies/renren.rb
|
72
|
-
- lib/omniauth_china/strategies/renren/helper.rb
|
73
72
|
- lib/omniauth_china/strategies/renren/service.rb
|
74
73
|
- lib/omniauth_china/strategies/renren/session.rb
|
75
74
|
- lib/omniauth_china/strategies/t163.rb
|
@@ -79,6 +78,7 @@ files:
|
|
79
78
|
- lib/omniauth_china/version.rb
|
80
79
|
- omniauth_china.gemspec
|
81
80
|
- spec/omniauth_china/strategies/douban_spec.rb
|
81
|
+
- spec/omniauth_china/strategies/renren_spec.rb
|
82
82
|
- spec/omniauth_china/strategies/t163_spec.rb
|
83
83
|
- spec/omniauth_china/strategies/tqq_spec.rb
|
84
84
|
- spec/omniauth_china/strategies/tsina_spec.rb
|
@@ -160,6 +160,7 @@ specification_version: 3
|
|
160
160
|
summary: "OmniAuth extension: omniauth for china"
|
161
161
|
test_files:
|
162
162
|
- spec/omniauth_china/strategies/douban_spec.rb
|
163
|
+
- spec/omniauth_china/strategies/renren_spec.rb
|
163
164
|
- spec/omniauth_china/strategies/t163_spec.rb
|
164
165
|
- spec/omniauth_china/strategies/tqq_spec.rb
|
165
166
|
- spec/omniauth_china/strategies/tsina_spec.rb
|
@@ -1,141 +0,0 @@
|
|
1
|
-
module OmniAuth
|
2
|
-
module Strategies
|
3
|
-
class Renren
|
4
|
-
module Helper
|
5
|
-
def omniauth_renren_connect_button
|
6
|
-
callback_path = "#{OmniAuth.config.path_prefix}/renren/callback"
|
7
|
-
@renren_connect_form_id = 'omniauth_renren_connect_form'
|
8
|
-
|
9
|
-
if defined?(::ActionView::Helpers::FormTagHelper)
|
10
|
-
|
11
|
-
form_tag(callback_path, :id => @renren_connect_form_id) do
|
12
|
-
renren_connect_button.html_safe
|
13
|
-
end
|
14
|
-
else
|
15
|
-
|
16
|
-
<<-HTML
|
17
|
-
<form accept-charset="UTF-8" action="#{callback_path}" id="#{@renren_connect_form_id}" method="post">
|
18
|
-
#{renren_connect_button}
|
19
|
-
</form>
|
20
|
-
HTML
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def omniauth_simple_renren_connect_button(options = {})
|
25
|
-
params = {
|
26
|
-
:src => "http://pics.wanlibo.com/images_cn/registration/renren.png",
|
27
|
-
:title => "renren connect",
|
28
|
-
:alt => "renren connect"
|
29
|
-
}.merge(options)
|
30
|
-
|
31
|
-
p = ""
|
32
|
-
params.each do |k, v|
|
33
|
-
p += k.to_s + "='" + v + "' "
|
34
|
-
end
|
35
|
-
simple_renren_connect_button(p).html_safe
|
36
|
-
end
|
37
|
-
|
38
|
-
def omniauth_renren_friends(options = {})
|
39
|
-
params = {
|
40
|
-
:max_rows => "2",
|
41
|
-
:face_space => "5",
|
42
|
-
:width => "217"
|
43
|
-
}.merge(options)
|
44
|
-
renren_friends(params).html_safe
|
45
|
-
end
|
46
|
-
|
47
|
-
def omniauth_renren_live_widget(options = {})
|
48
|
-
params = {
|
49
|
-
:width => "370px",
|
50
|
-
:height => "390px"
|
51
|
-
}.merge(options)
|
52
|
-
renren_live_widget(params).html_safe
|
53
|
-
end
|
54
|
-
|
55
|
-
def omniauth_renren_like_button(options = {})
|
56
|
-
params = {
|
57
|
-
:width => "200px",
|
58
|
-
:height => "70px",
|
59
|
-
:url => root_url
|
60
|
-
}.merge(options)
|
61
|
-
renren_like_button(params).html_safe
|
62
|
-
end
|
63
|
-
|
64
|
-
def omniauth_renren_invite(options = {})
|
65
|
-
params = {
|
66
|
-
:content => "Join us",
|
67
|
-
:url1 => "http://www.renren.com",
|
68
|
-
:label1 => "Go",
|
69
|
-
:url2 => "http://apps.renren.com/yourapp",
|
70
|
-
:label2 => "Accept",
|
71
|
-
:action => "/yourapp/youraction",
|
72
|
-
:friend_text => "Invite your friends",
|
73
|
-
:max => "5",
|
74
|
-
:mode => "all",
|
75
|
-
:width => "735",
|
76
|
-
:height => "450"
|
77
|
-
}.merge(options)
|
78
|
-
renren_invite(params).html_safe
|
79
|
-
end
|
80
|
-
|
81
|
-
def omniauth_renren_javascript
|
82
|
-
renren_javascript.html_safe
|
83
|
-
end
|
84
|
-
|
85
|
-
private
|
86
|
-
|
87
|
-
def renren_invite(options)
|
88
|
-
<<-HTML
|
89
|
-
<xn:serverxnml>
|
90
|
-
<script type="text/xnml">
|
91
|
-
<xn:request-form content="#{options[:content]} <xn:req-choice url="#{options[:url1]}" label="#{options[:label1]}"><xn:req-choice url="#{options[:url2]}" label="#{options[:label2]}">" action="#{options[:action]}">
|
92
|
-
<xn:multi-friend-selector-x actiontext="#{options[:friend_text]}" max="#{options[:max]}" mode="#{options[:mode]}" width="#{options[:width]}" height="#{options[:height]}" />
|
93
|
-
</xn:request-form></script></xn:serverxnml>
|
94
|
-
HTML
|
95
|
-
end
|
96
|
-
|
97
|
-
def renren_like_button(options = {})
|
98
|
-
<<-HTML
|
99
|
-
<iframe scrolling="no" frameborder="0" allowtransparency="true" src="http://www.connect.renren.com/like?url=#{options[:url]}" style="width: #{options[:width]};height: #{options[:height]};"></iframe>
|
100
|
-
HTML
|
101
|
-
end
|
102
|
-
|
103
|
-
def renren_live_widget(options = {})
|
104
|
-
<<-HTML
|
105
|
-
<iframe scrolling="no" frameborder="0" src="http://www.connect.renren.com/widget/liveWidget?api_key=#{Renren.api_key}&xid=default&desp=%E5%A4%A7%E5%AE%B6%E6%9D%A5%E8%AE%A8%E8%AE%BA" style="width: #{options[:width]};height: #{options[:height]};"></iframe>
|
106
|
-
HTML
|
107
|
-
end
|
108
|
-
|
109
|
-
def renren_friends(options = {})
|
110
|
-
<<-HTML
|
111
|
-
<xn:friendpile show-faces="all" face-size="small" max-rows="#{options[:max_rows]}" face-space="#{options[:face_space]}" width="#{options[:width]}"></xn:friendpile>
|
112
|
-
HTML
|
113
|
-
end
|
114
|
-
|
115
|
-
def simple_renren_connect_button(properties)
|
116
|
-
callback_path = "#{OmniAuth.config.path_prefix}/renren/callback"
|
117
|
-
<<-HTML
|
118
|
-
<img #{properties} onclick="XN.Connect.requireSession(function(){window.location.href='#{callback_path}';});return false;"></img>
|
119
|
-
HTML
|
120
|
-
end
|
121
|
-
|
122
|
-
def renren_connect_button
|
123
|
-
<<-HTML
|
124
|
-
<xn:login-button autologoutlink="true" onlogin="document.getElementById('#{@renren_connect_form_id}').submit();"></xn:login-button>
|
125
|
-
HTML
|
126
|
-
end
|
127
|
-
|
128
|
-
def renren_javascript
|
129
|
-
<<-HTML
|
130
|
-
<script src="http://static.connect.renren.com/js/v1.0/FeatureLoader.jsp" type="text/javascript"></script>
|
131
|
-
<script type="text/javascript">
|
132
|
-
//<![CDATA[
|
133
|
-
XN_RequireFeatures(['EXNML'], function(){ XN.Main.init('#{Renren.api_key}', '/xd_receiver.html'); });
|
134
|
-
//]]>
|
135
|
-
</script>
|
136
|
-
HTML
|
137
|
-
end
|
138
|
-
end
|
139
|
-
end
|
140
|
-
end
|
141
|
-
end
|