omniauth_china 0.0.3 → 0.0.4.beta1
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 +13 -40
- data/README.markdown +71 -0
- data/lib/LICENSE.rdoc +19 -0
- data/lib/generators/omniauth_renren/install/install_generator.rb +15 -0
- data/lib/generators/omniauth_renren/install/templates/public/xd_receiver.html +9 -0
- data/lib/omniauth_china/oauth_china.rb +2 -0
- data/lib/omniauth_china/strategies/renren/helper.rb +141 -0
- data/lib/omniauth_china/strategies/renren/service.rb +22 -0
- data/lib/omniauth_china/strategies/renren/session.rb +99 -0
- data/lib/omniauth_china/strategies/renren.rb +48 -0
- data/lib/omniauth_china/strategies/tqq.rb +64 -0
- data/lib/omniauth_china/strategies/tsohu.rb +1 -1
- data/lib/omniauth_china/version.rb +1 -1
- data/omniauth_china.gemspec +8 -3
- data/spec/omniauth_china/strategies/tqq_spec.rb +5 -0
- metadata +104 -11
data/Gemfile.lock
CHANGED
@@ -1,8 +1,13 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
omniauth_china (0.0.
|
5
|
-
|
4
|
+
omniauth_china (0.0.3)
|
5
|
+
multi_json (~> 0.0.2)
|
6
|
+
nokogiri (~> 1.4.2)
|
7
|
+
oa-core (~> 0.2.0.beta1)
|
8
|
+
oa-oauth (~> 0.2.0.beta1)
|
9
|
+
oauth (~> 0.4.0)
|
10
|
+
oauth2 (~> 0.1.0)
|
6
11
|
|
7
12
|
GEM
|
8
13
|
remote: http://rubygems.org/
|
@@ -73,54 +78,23 @@ GEM
|
|
73
78
|
mime-types (1.16)
|
74
79
|
multi_json (0.0.5)
|
75
80
|
multipart-post (1.1.0)
|
76
|
-
net-ldap (0.1.1)
|
77
81
|
nokogiri (1.4.4)
|
78
|
-
oa-basic (0.2.0)
|
79
|
-
multi_json (~> 0.0.2)
|
80
|
-
nokogiri (~> 1.4.2)
|
81
|
-
oa-core (= 0.2.0)
|
82
|
-
rest-client (~> 1.6.0)
|
83
82
|
oa-core (0.2.0)
|
84
83
|
rack (~> 1.1)
|
85
|
-
oa-enterprise (0.2.0)
|
86
|
-
net-ldap (~> 0.1.1)
|
87
|
-
nokogiri (~> 1.4.2)
|
88
|
-
oa-core (= 0.2.0)
|
89
|
-
pyu-ruby-sasl (~> 0.0.3.1)
|
90
|
-
rubyntlm (~> 0.1.1)
|
91
|
-
oa-more (0.2.0)
|
92
|
-
multi_json (~> 0.0.2)
|
93
|
-
oa-core (= 0.2.0)
|
94
|
-
rest-client (~> 1.6.0)
|
95
84
|
oa-oauth (0.2.0)
|
96
85
|
multi_json (~> 0.0.2)
|
97
86
|
nokogiri (~> 1.4.2)
|
98
87
|
oa-core (= 0.2.0)
|
99
88
|
oauth (~> 0.4.0)
|
100
89
|
oauth2 (~> 0.1.1)
|
101
|
-
oa-openid (0.2.0)
|
102
|
-
oa-core (= 0.2.0)
|
103
|
-
rack-openid (~> 1.2.0)
|
104
|
-
ruby-openid-apps-discovery
|
105
90
|
oauth (0.4.4)
|
106
91
|
oauth2 (0.1.1)
|
107
92
|
faraday (~> 0.5.0)
|
108
93
|
multi_json (~> 0.0.4)
|
109
|
-
omniauth (0.2.0)
|
110
|
-
oa-basic (= 0.2.0)
|
111
|
-
oa-core (= 0.2.0)
|
112
|
-
oa-enterprise (= 0.2.0)
|
113
|
-
oa-more (= 0.2.0)
|
114
|
-
oa-oauth (= 0.2.0)
|
115
|
-
oa-openid (= 0.2.0)
|
116
94
|
polyglot (0.3.1)
|
117
|
-
pyu-ruby-sasl (0.0.3.2)
|
118
95
|
rack (1.2.2)
|
119
96
|
rack-mount (0.6.14)
|
120
97
|
rack (>= 1.0.0)
|
121
|
-
rack-openid (1.2.0)
|
122
|
-
rack (>= 1.1.0)
|
123
|
-
ruby-openid (>= 2.1.8)
|
124
98
|
rack-test (0.5.7)
|
125
99
|
rack (>= 1.0)
|
126
100
|
rails (3.0.3)
|
@@ -137,8 +111,6 @@ GEM
|
|
137
111
|
rake (>= 0.8.7)
|
138
112
|
thor (~> 0.14.4)
|
139
113
|
rake (0.8.7)
|
140
|
-
rest-client (1.6.1)
|
141
|
-
mime-types (>= 1.16)
|
142
114
|
rspec (2.0.1)
|
143
115
|
rspec-core (~> 2.0.1)
|
144
116
|
rspec-expectations (~> 2.0.1)
|
@@ -149,10 +121,6 @@ GEM
|
|
149
121
|
rspec-mocks (2.0.1)
|
150
122
|
rspec-core (~> 2.0.1)
|
151
123
|
rspec-expectations (~> 2.0.1)
|
152
|
-
ruby-openid (2.1.8)
|
153
|
-
ruby-openid-apps-discovery (1.2.0)
|
154
|
-
ruby-openid (>= 2.1.7)
|
155
|
-
rubyntlm (0.1.1)
|
156
124
|
rubyzip (0.9.4)
|
157
125
|
selenium-webdriver (0.1.4)
|
158
126
|
childprocess (>= 0.1.7)
|
@@ -177,7 +145,12 @@ DEPENDENCIES
|
|
177
145
|
capybara (>= 0.4.0)
|
178
146
|
json (~> 1.4.3)
|
179
147
|
mg (~> 0.0.8)
|
180
|
-
|
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)
|
181
154
|
omniauth_china!
|
182
155
|
rack
|
183
156
|
rack-test (~> 0.5.4)
|
data/README.markdown
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
# OmniAuth: Standardized Multi-Provider Authentication
|
2
|
+
|
3
|
+
OmniAuth is a new Rack-based authentication system for multi-provider external authentcation. OmniAuth is built from the ground up on the philosophy that **authentication is not the same as identity**, and is based on two observations:
|
4
|
+
|
5
|
+
# OmniAuthChina (omniauth_china)
|
6
|
+
|
7
|
+
OmniAuth China is an extention of OmniAuth, it addes Open ID providers in China such as Douban, Sina, Sohu, 163, Tencent, Renren, etc.
|
8
|
+
|
9
|
+
## Installation
|
10
|
+
|
11
|
+
To install OmniAuthChina, simply install the gem:
|
12
|
+
|
13
|
+
gem install omniauth_china
|
14
|
+
|
15
|
+
## Providers
|
16
|
+
|
17
|
+
OmniAuth currently supports the following external providers:
|
18
|
+
|
19
|
+
* via OAuth
|
20
|
+
* Douban (credit: [rainux](http://github.com/rainux))
|
21
|
+
* Tsina (credit: [he9qi](http://github.com/he9qi))
|
22
|
+
* T163 (credit: [he9qi](http://github.com/he9qi))
|
23
|
+
* Tsohu (credit: [he9qi](http://github.com/he9qi))
|
24
|
+
* Tqq (credit: [he9qi](http://github.com/he9qi))
|
25
|
+
* Renren (Renren Connect of renren.com) (credit: [taweili](http://github.com/taweili), [rainux](http://github.com/rainux))
|
26
|
+
|
27
|
+
## 人人
|
28
|
+
|
29
|
+
Run the generator to generate `xd_receiver.html` and include helper into ApplicationHelper:
|
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'
|
41
|
+
|
42
|
+
## Usage
|
43
|
+
|
44
|
+
OmniAuth is a collection of Rack middleware. To use a single strategy, you simply need to add the middleware:
|
45
|
+
|
46
|
+
require 'oa-oauth'
|
47
|
+
use OmniAuth::Strategies::Twitter, 'CONSUMER_KEY', 'CONSUMER_SECRET'
|
48
|
+
|
49
|
+
Now to initiate authentication you merely need to redirect the user to `/auth/twitter` via a link or other means. Once the user has authenticated to Twitter, they will be redirected to `/auth/twitter/callback`. You should build an endpoint that handles this URL, at which point you will will have access to the authentication information through the `omniauth.auth` parameter of the Rack environment. For example, in Sinatra you would do something like this:
|
50
|
+
|
51
|
+
get '/auth/twitter/callback' do
|
52
|
+
auth_hash = request.env['omniauth.auth']
|
53
|
+
end
|
54
|
+
|
55
|
+
The hash in question will look something like this:
|
56
|
+
|
57
|
+
{
|
58
|
+
'uid' => '12356',
|
59
|
+
'provider' => 'twitter',
|
60
|
+
'user_info' => {
|
61
|
+
'name' => 'User Name',
|
62
|
+
'nickname' => 'username',
|
63
|
+
# ...
|
64
|
+
}
|
65
|
+
}
|
66
|
+
|
67
|
+
The `user_info` hash will automatically be populated with as much information about the user as OmniAuth was able to pull from the given API or authentication provider.
|
68
|
+
|
69
|
+
## TODO
|
70
|
+
|
71
|
+
Write better tests!!
|
data/lib/LICENSE.rdoc
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
Copyright (c) 2010 Qi He.
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
of this software and associated documentation files (the "Software"), to deal
|
5
|
+
in the Software without restriction, including without limitation the rights
|
6
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
copies of the Software, and to permit persons to whom the Software is
|
8
|
+
furnished to do so, subject to the following conditions:
|
9
|
+
|
10
|
+
The above copyright notice and this permission notice shall be included in
|
11
|
+
all copies or substantial portions of the Software.
|
12
|
+
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
|
+
THE SOFTWARE.
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module OmniauthRenren
|
2
|
+
class InstallGenerator < Rails::Generators::Base
|
3
|
+
source_root File.expand_path('../templates', __FILE__)
|
4
|
+
|
5
|
+
def copy_files
|
6
|
+
copy_file 'public/xd_receiver.html'
|
7
|
+
end
|
8
|
+
|
9
|
+
def include_helper
|
10
|
+
inject_into_file 'app/helpers/application_helper.rb', :after => "module ApplicationHelper\n" do
|
11
|
+
" include OmniAuth::Strategies::Renren::Helper\n"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
2
|
+
<html xmlns="http://www.w3.org/1999/xhtml">
|
3
|
+
<head>
|
4
|
+
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
5
|
+
</head>
|
6
|
+
<body>
|
7
|
+
<script src="http://static.connect.renren.com/js/v1.0/XdCommReceiver.jsp" type="text/javascript"></script>
|
8
|
+
</body>
|
9
|
+
</html>
|
@@ -6,5 +6,7 @@ module OmniAuth
|
|
6
6
|
autoload :Tsina, 'omniauth_china/strategies/tsina'
|
7
7
|
autoload :T163, 'omniauth_china/strategies/t163'
|
8
8
|
autoload :Tsohu, 'omniauth_china/strategies/tsohu'
|
9
|
+
autoload :Tqq, 'omniauth_china/strategies/tqq'
|
10
|
+
autoload :Renren, 'omniauth_china/strategies/renren'
|
9
11
|
end
|
10
12
|
end
|
@@ -0,0 +1,141 @@
|
|
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
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
require 'pp'
|
3
|
+
|
4
|
+
module OmniAuth
|
5
|
+
module Strategies
|
6
|
+
class Renren
|
7
|
+
class Service
|
8
|
+
DEBUG = false
|
9
|
+
|
10
|
+
def post(params)
|
11
|
+
pp "### Posting Params: #{params.inspect}" if DEBUG
|
12
|
+
Net::HTTP.post_form(url, params)
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
def url
|
17
|
+
URI.parse('http://api.renren.com/restserver.do')
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
require 'digest/md5'
|
2
|
+
require 'multi_json'
|
3
|
+
|
4
|
+
module OmniAuth
|
5
|
+
module Strategies
|
6
|
+
class Renren
|
7
|
+
class Session
|
8
|
+
class IncorrectSignature < Exception; end
|
9
|
+
class SessionExpired < Exception; end
|
10
|
+
class OtherException < Exception; end
|
11
|
+
|
12
|
+
attr_reader :session_key
|
13
|
+
attr_reader :expires
|
14
|
+
attr_reader :uid
|
15
|
+
|
16
|
+
def initialize(cookies)
|
17
|
+
options = extract_renren_cookies(cookies)
|
18
|
+
@expires = options['expires'] ? Integer(options['expires']) : 0
|
19
|
+
@session_key = options['session_key']
|
20
|
+
@uid = options['user']
|
21
|
+
end
|
22
|
+
|
23
|
+
def user
|
24
|
+
@user ||= invoke_method('users.getInfo', :uids => @uid, :format => :json).first
|
25
|
+
end
|
26
|
+
|
27
|
+
def infinite?
|
28
|
+
@expires == 0
|
29
|
+
end
|
30
|
+
|
31
|
+
def expired?
|
32
|
+
@expires.nil? || (!infinite? && Time.at(@expires) <= Time.now)
|
33
|
+
end
|
34
|
+
|
35
|
+
def secured?
|
36
|
+
!@session_key.nil? && !expired?
|
37
|
+
end
|
38
|
+
|
39
|
+
def invoke_method(method, params = {})
|
40
|
+
xn_params = {
|
41
|
+
:method => method,
|
42
|
+
:api_key => Renren.api_key,
|
43
|
+
:session_key => session_key,
|
44
|
+
:call_id => Time.now.to_i,
|
45
|
+
:v => '1.0',
|
46
|
+
:format => :json
|
47
|
+
}
|
48
|
+
xn_params.merge!(params) if params
|
49
|
+
xn_params.merge!(:sig => compute_sig(xn_params))
|
50
|
+
MultiJson.decode(Service.new.post(xn_params).body)
|
51
|
+
end
|
52
|
+
|
53
|
+
class << self
|
54
|
+
private
|
55
|
+
def verify_signature(renren_sig_params, expected_signature)
|
56
|
+
raise Renren::Session::IncorrectSignature if compute_sig(renren_sig_params) != expected_signature
|
57
|
+
# raise Renren::Session::SignatureTooOld if renren_sig_params['time'] && Time.at(renren_sig_params['time'].to_f) < earliest_valid_session
|
58
|
+
true
|
59
|
+
end
|
60
|
+
|
61
|
+
def compute_sig(params)
|
62
|
+
raw_string = params.collect {|*args| args.join('=') }.sort.join
|
63
|
+
actual_sig = Digest::MD5.hexdigest([raw_string, Renren.secret_key].join)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
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
|
+
|
89
|
+
def verify_signature(renren_sig_params, expected_signature)
|
90
|
+
self.class.send :verify_signature, renren_sig_params, expected_signature
|
91
|
+
end
|
92
|
+
|
93
|
+
def compute_sig(params)
|
94
|
+
self.class.send :compute_sig, params
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'omniauth_china/oauth_china'
|
2
|
+
|
3
|
+
module OmniAuth
|
4
|
+
module Strategies
|
5
|
+
class Renren
|
6
|
+
include OmniAuth::Strategy
|
7
|
+
autoload :Session, 'omniauth_china/strategies/renren/session'
|
8
|
+
autoload :Service, 'omniauth_china/strategies/renren/service'
|
9
|
+
autoload :Helper, 'omniauth_china/strategies/renren/helper'
|
10
|
+
|
11
|
+
class << self
|
12
|
+
def api_key
|
13
|
+
@@api_key
|
14
|
+
end
|
15
|
+
|
16
|
+
def secret_key
|
17
|
+
@@secret_key
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def initialize(app, api_key, secret_key, options = {})
|
22
|
+
@@api_key = api_key
|
23
|
+
@@secret_key = secret_key
|
24
|
+
|
25
|
+
super(app, :renren, options)
|
26
|
+
end
|
27
|
+
|
28
|
+
def request_phase
|
29
|
+
@response.finish
|
30
|
+
end
|
31
|
+
|
32
|
+
def callback_phase
|
33
|
+
@renren_session = Renren::Session.new(request.cookies)
|
34
|
+
super
|
35
|
+
end
|
36
|
+
|
37
|
+
def auth_hash
|
38
|
+
OmniAuth::Utils.deep_merge(super, {
|
39
|
+
'uid' => @renren_session.uid,
|
40
|
+
'user_info' => @renren_session.user,
|
41
|
+
'extra' => {
|
42
|
+
'renren_session' => @renren_session
|
43
|
+
}
|
44
|
+
})
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'omniauth/oauth'
|
2
|
+
require 'multi_json'
|
3
|
+
|
4
|
+
module OmniAuth
|
5
|
+
module Strategies
|
6
|
+
#
|
7
|
+
# Authenticate to Tqq via OAuth and retrieve basic
|
8
|
+
# user information.
|
9
|
+
#
|
10
|
+
# Usage:
|
11
|
+
#
|
12
|
+
# use OmniAuth::Strategies::Tqq, 'APIKey', 'APIKeySecret'
|
13
|
+
#
|
14
|
+
class Tqq < OmniAuth::Strategies::OAuth
|
15
|
+
|
16
|
+
def initialize(app, consumer_key = nil, consumer_secret = nil, options = {}, &block)
|
17
|
+
@api_key = consumer_key
|
18
|
+
|
19
|
+
client_options = {
|
20
|
+
:site => 'https://open.t.qq.com',
|
21
|
+
:request_token_path => '/cgi-bin/request_token',
|
22
|
+
:access_token_path => '/cgi-bin/access_token',
|
23
|
+
:authorize_path => '/cgi-bin/authorize',
|
24
|
+
:realm => 'OmniAuth',
|
25
|
+
:scheme => :query_string,
|
26
|
+
:nonce => nonce,
|
27
|
+
:http_method => :get,
|
28
|
+
}
|
29
|
+
|
30
|
+
super(app, :tqq, consumer_key, consumer_secret, client_options, options, &block)
|
31
|
+
end
|
32
|
+
|
33
|
+
def nonce
|
34
|
+
Base64.encode64(OpenSSL::Random.random_bytes(32)).gsub(/\W/, '')[0, 32]
|
35
|
+
end
|
36
|
+
|
37
|
+
def auth_hash
|
38
|
+
OmniAuth::Utils.deep_merge(super, {
|
39
|
+
'uid' => user_hash["data"]['uid'],
|
40
|
+
'user_info' => user_info,
|
41
|
+
'extra' => {'user_hash' => user_hash}
|
42
|
+
})
|
43
|
+
end
|
44
|
+
|
45
|
+
def user_info
|
46
|
+
user_hash = self.user_hash
|
47
|
+
{
|
48
|
+
'username' => user_hash["data"]['name'],
|
49
|
+
'name' => user_hash["data"]['nick'],
|
50
|
+
'location' => user_hash["data"]['location'],
|
51
|
+
'image' => user_hash["data"]['head'],
|
52
|
+
'description' => user_hash['description'],
|
53
|
+
'urls' => {
|
54
|
+
'Tqq' => 't.qq.com'
|
55
|
+
}
|
56
|
+
}
|
57
|
+
end
|
58
|
+
|
59
|
+
def user_hash
|
60
|
+
@user_hash ||= MultiJson.decode(@access_token.get("http://open.t.qq.com/api/user/info?format=json").body)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -21,7 +21,7 @@ module OmniAuth
|
|
21
21
|
:request_token_path => '/oauth/request_token',
|
22
22
|
:access_token_path => '/oauth/access_token',
|
23
23
|
:authorize_path => '/oauth/authorize',
|
24
|
-
:
|
24
|
+
:scheme => :header,
|
25
25
|
}
|
26
26
|
|
27
27
|
super(app, :tsohu, consumer_key, consumer_secret, client_options, options, &block)
|
data/omniauth_china.gemspec
CHANGED
@@ -9,12 +9,17 @@ Gem::Specification.new do |s|
|
|
9
9
|
s.authors = ["Qi He"]
|
10
10
|
s.email = ["qihe229@gmail.com"]
|
11
11
|
s.homepage = "http://rubygems.org/gems/omniauth_china"
|
12
|
-
s.summary = %q{OmniAuth
|
13
|
-
s.description = %q{This is an extention of OmniAuth, it addes Open ID providers in China such as Douban, Sina, Sohu, 163, etc.}
|
12
|
+
s.summary = %q{OmniAuth extension: omniauth for china}
|
13
|
+
s.description = %q{This is an extention of OmniAuth, it addes Open ID providers in China such as Douban, Sina, Sohu, 163, Tencent, Renren, etc.}
|
14
14
|
|
15
15
|
s.rubyforge_project = "omniauth_china"
|
16
16
|
|
17
|
-
s.add_dependency '
|
17
|
+
s.add_dependency 'oa-core', '~> 0.2.0.beta1'
|
18
|
+
s.add_dependency 'oa-oauth', '~> 0.2.0.beta1'
|
19
|
+
s.add_dependency 'multi_json', '~> 0.0.2'
|
20
|
+
s.add_dependency 'nokogiri', '~> 1.4.2'
|
21
|
+
s.add_dependency 'oauth', '~> 0.4.0'
|
22
|
+
s.add_dependency 'oauth2', '~> 0.1.0'
|
18
23
|
|
19
24
|
s.files = `git ls-files`.split("\n")
|
20
25
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
metadata
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: omniauth_china
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
prerelease:
|
4
|
+
prerelease: true
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
|
8
|
+
- 4
|
9
|
+
- beta1
|
10
|
+
version: 0.0.4.beta1
|
10
11
|
platform: ruby
|
11
12
|
authors:
|
12
13
|
- Qi He
|
@@ -18,19 +19,98 @@ date: 2011-03-26 00:00:00 -07:00
|
|
18
19
|
default_executable:
|
19
20
|
dependencies:
|
20
21
|
- !ruby/object:Gem::Dependency
|
21
|
-
name:
|
22
|
+
name: oa-core
|
22
23
|
prerelease: false
|
23
24
|
requirement: &id001 !ruby/object:Gem::Requirement
|
24
25
|
none: false
|
25
26
|
requirements:
|
26
|
-
- -
|
27
|
+
- - ~>
|
27
28
|
- !ruby/object:Gem::Version
|
28
29
|
segments:
|
29
30
|
- 0
|
30
|
-
|
31
|
+
- 2
|
32
|
+
- 0
|
33
|
+
- beta1
|
34
|
+
version: 0.2.0.beta1
|
31
35
|
type: :runtime
|
32
36
|
version_requirements: *id001
|
33
|
-
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: oa-oauth
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
segments:
|
46
|
+
- 0
|
47
|
+
- 2
|
48
|
+
- 0
|
49
|
+
- beta1
|
50
|
+
version: 0.2.0.beta1
|
51
|
+
type: :runtime
|
52
|
+
version_requirements: *id002
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: multi_json
|
55
|
+
prerelease: false
|
56
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
segments:
|
62
|
+
- 0
|
63
|
+
- 0
|
64
|
+
- 2
|
65
|
+
version: 0.0.2
|
66
|
+
type: :runtime
|
67
|
+
version_requirements: *id003
|
68
|
+
- !ruby/object:Gem::Dependency
|
69
|
+
name: nokogiri
|
70
|
+
prerelease: false
|
71
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
72
|
+
none: false
|
73
|
+
requirements:
|
74
|
+
- - ~>
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
segments:
|
77
|
+
- 1
|
78
|
+
- 4
|
79
|
+
- 2
|
80
|
+
version: 1.4.2
|
81
|
+
type: :runtime
|
82
|
+
version_requirements: *id004
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: oauth
|
85
|
+
prerelease: false
|
86
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
87
|
+
none: false
|
88
|
+
requirements:
|
89
|
+
- - ~>
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
segments:
|
92
|
+
- 0
|
93
|
+
- 4
|
94
|
+
- 0
|
95
|
+
version: 0.4.0
|
96
|
+
type: :runtime
|
97
|
+
version_requirements: *id005
|
98
|
+
- !ruby/object:Gem::Dependency
|
99
|
+
name: oauth2
|
100
|
+
prerelease: false
|
101
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
102
|
+
none: false
|
103
|
+
requirements:
|
104
|
+
- - ~>
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
segments:
|
107
|
+
- 0
|
108
|
+
- 1
|
109
|
+
- 0
|
110
|
+
version: 0.1.0
|
111
|
+
type: :runtime
|
112
|
+
version_requirements: *id006
|
113
|
+
description: This is an extention of OmniAuth, it addes Open ID providers in China such as Douban, Sina, Sohu, 163, Tencent, Renren, etc.
|
34
114
|
email:
|
35
115
|
- qihe229@gmail.com
|
36
116
|
executables: []
|
@@ -43,17 +123,27 @@ files:
|
|
43
123
|
- .gitignore
|
44
124
|
- Gemfile
|
45
125
|
- Gemfile.lock
|
126
|
+
- README.markdown
|
46
127
|
- Rakefile
|
128
|
+
- lib/LICENSE.rdoc
|
129
|
+
- lib/generators/omniauth_renren/install/install_generator.rb
|
130
|
+
- lib/generators/omniauth_renren/install/templates/public/xd_receiver.html
|
47
131
|
- lib/omniauth_china.rb
|
48
132
|
- lib/omniauth_china/oauth_china.rb
|
49
133
|
- lib/omniauth_china/strategies/douban.rb
|
134
|
+
- lib/omniauth_china/strategies/renren.rb
|
135
|
+
- lib/omniauth_china/strategies/renren/helper.rb
|
136
|
+
- lib/omniauth_china/strategies/renren/service.rb
|
137
|
+
- lib/omniauth_china/strategies/renren/session.rb
|
50
138
|
- lib/omniauth_china/strategies/t163.rb
|
139
|
+
- lib/omniauth_china/strategies/tqq.rb
|
51
140
|
- lib/omniauth_china/strategies/tsina.rb
|
52
141
|
- lib/omniauth_china/strategies/tsohu.rb
|
53
142
|
- lib/omniauth_china/version.rb
|
54
143
|
- omniauth_china.gemspec
|
55
144
|
- spec/omniauth_china/strategies/douban_spec.rb
|
56
145
|
- spec/omniauth_china/strategies/t163_spec.rb
|
146
|
+
- spec/omniauth_china/strategies/tqq_spec.rb
|
57
147
|
- spec/omniauth_china/strategies/tsina_spec.rb
|
58
148
|
- spec/omniauth_china/strategies/tsohu_spec.rb
|
59
149
|
- spec/spec_helper.rb
|
@@ -119,21 +209,24 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
119
209
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
120
210
|
none: false
|
121
211
|
requirements:
|
122
|
-
- - "
|
212
|
+
- - ">"
|
123
213
|
- !ruby/object:Gem::Version
|
124
214
|
segments:
|
125
|
-
-
|
126
|
-
|
215
|
+
- 1
|
216
|
+
- 3
|
217
|
+
- 1
|
218
|
+
version: 1.3.1
|
127
219
|
requirements: []
|
128
220
|
|
129
221
|
rubyforge_project: omniauth_china
|
130
222
|
rubygems_version: 1.3.7
|
131
223
|
signing_key:
|
132
224
|
specification_version: 3
|
133
|
-
summary: "OmniAuth
|
225
|
+
summary: "OmniAuth extension: omniauth for china"
|
134
226
|
test_files:
|
135
227
|
- spec/omniauth_china/strategies/douban_spec.rb
|
136
228
|
- spec/omniauth_china/strategies/t163_spec.rb
|
229
|
+
- spec/omniauth_china/strategies/tqq_spec.rb
|
137
230
|
- spec/omniauth_china/strategies/tsina_spec.rb
|
138
231
|
- spec/omniauth_china/strategies/tsohu_spec.rb
|
139
232
|
- spec/spec_helper.rb
|