the_social_login 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +14 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +31 -0
- data/Rakefile +2 -0
- data/app/models/concerns/social_networks_login_base.rb +229 -0
- data/gem_version.rb +3 -0
- data/lib/the_social_login.rb +8 -0
- data/lib/the_social_login/version.rb +1 -0
- data/spec/oauth_registration.rb +472 -0
- data/the_social_login.gemspec +24 -0
- metadata +98 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e8cc11df2eacf2f1df99a97c2edf508014035c98
|
4
|
+
data.tar.gz: 34d8188ebf868980b0a3ab09ac485764d2aa4fd2
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 4cd1d2b5755e90f3e94328385fbb97ad82e19f88dc80f0b97a7d8ba9285ef04f1a7215962e3597860028e90a994e3762c3974a503aee23f4fec61ea153f0f42e
|
7
|
+
data.tar.gz: 219a0efd74b08d3c53bf8816975c7d14db9c6ae88ac9341d32aab9655d00703c9ef3b9290f054d724707605b3f04dc01a05037f12d7d476b46128e94219b4d8f
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 Ilya N. Zykin
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
# TheSocialLogin
|
2
|
+
|
3
|
+
TODO: Write a gem description
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
gem 'the_social_login'
|
11
|
+
```
|
12
|
+
|
13
|
+
And then execute:
|
14
|
+
|
15
|
+
$ bundle
|
16
|
+
|
17
|
+
Or install it yourself as:
|
18
|
+
|
19
|
+
$ gem install the_social_login
|
20
|
+
|
21
|
+
## Usage
|
22
|
+
|
23
|
+
TODO: Write usage instructions here
|
24
|
+
|
25
|
+
## Contributing
|
26
|
+
|
27
|
+
1. Fork it ( https://github.com/[my-github-username]/the_social_login/fork )
|
28
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
29
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
30
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
31
|
+
5. Create a new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,229 @@
|
|
1
|
+
module SocialNetworksLogin
|
2
|
+
module Base
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
def self.networks_list
|
6
|
+
%w[ vkontakte facebook twitter google_oauth2 odnoklassniki ]
|
7
|
+
end
|
8
|
+
|
9
|
+
|
10
|
+
included do
|
11
|
+
attr_accessor :oauth_data
|
12
|
+
|
13
|
+
has_many :credentials, dependent: :destroy
|
14
|
+
|
15
|
+
before_validation :set_oauth_params, on: :create, if: ->{ oauth? }
|
16
|
+
before_validation :define_login, on: :create, if: ->{ oauth? }
|
17
|
+
before_validation :define_email, on: :create, if: ->{ oauth? }
|
18
|
+
before_validation :define_password, on: :create, if: ->{ oauth? }
|
19
|
+
before_save :skip_confirmation!, on: :create, if: ->{ oauth? }
|
20
|
+
|
21
|
+
after_save :create_credential, if: ->{ oauth? }
|
22
|
+
after_save :upload_oauth_avatar, if: ->{ oauth? }
|
23
|
+
|
24
|
+
def set_oauth_params
|
25
|
+
set_params_common_oauth
|
26
|
+
set_params_from_tw_oauth if twitter_oauth?
|
27
|
+
set_params_from_fb_oauth if facebook_oauth?
|
28
|
+
set_params_from_vk_oauth if vkontakte_oauth?
|
29
|
+
set_params_from_gp_oauth if google_oauth2_oauth?
|
30
|
+
set_params_from_ok_oauth if odnoklassniki_oauth?
|
31
|
+
end
|
32
|
+
|
33
|
+
def default_email_domain
|
34
|
+
'my-web-site.com'
|
35
|
+
end
|
36
|
+
|
37
|
+
def attempts_to_generate
|
38
|
+
10
|
39
|
+
end
|
40
|
+
|
41
|
+
# do something common here
|
42
|
+
def set_params_common_oauth
|
43
|
+
self.username = info.try(:[], 'name')
|
44
|
+
end
|
45
|
+
|
46
|
+
# do something special here
|
47
|
+
def set_params_from_gp_oauth
|
48
|
+
self.gp_addr = info.try(:[], 'urls').try(:[], 'Google')
|
49
|
+
end
|
50
|
+
|
51
|
+
def set_params_from_fb_oauth
|
52
|
+
self.fb_addr = info.try(:[], 'urls').try(:[], 'Facebook')
|
53
|
+
end
|
54
|
+
|
55
|
+
def set_params_from_vk_oauth
|
56
|
+
self.vk_addr = info.try(:[], 'urls').try(:[], 'Vkontakte')
|
57
|
+
end
|
58
|
+
|
59
|
+
def set_params_from_tw_oauth
|
60
|
+
self.tw_addr = info.try(:[], 'urls').try(:[], 'Twitter')
|
61
|
+
end
|
62
|
+
|
63
|
+
def set_params_from_ok_oauth
|
64
|
+
self.ok_addr = info.try(:[], 'urls').try(:[], 'Odnoklassniki')
|
65
|
+
end
|
66
|
+
|
67
|
+
def create_credential_with_oauth(uid, provider, _credentials)
|
68
|
+
exp_date = nil
|
69
|
+
exp_date = (Time.now + _credentials['expires_at'].to_i.seconds) if !_credentials['expires_at'].blank?
|
70
|
+
|
71
|
+
credentials_record = credentials.where(provider: provider).first
|
72
|
+
|
73
|
+
unless credentials_record
|
74
|
+
credentials_record = credentials.create(
|
75
|
+
uid: uid,
|
76
|
+
provider: provider,
|
77
|
+
expires_at: exp_date,
|
78
|
+
access_token: _credentials['token'],
|
79
|
+
access_token_secret: _credentials['secret'] # twitter
|
80
|
+
)
|
81
|
+
|
82
|
+
SystemMessage.create_credentials_for_user(self, provider)
|
83
|
+
end
|
84
|
+
|
85
|
+
credentials_record
|
86
|
+
end
|
87
|
+
|
88
|
+
def update_social_networks_urls! omniauth
|
89
|
+
info = omniauth.try(:[], 'info')
|
90
|
+
|
91
|
+
self.gp_addr = info.try(:[], 'urls').try(:[], 'Google') if self.gp_addr.blank?
|
92
|
+
self.fb_addr = info.try(:[], 'urls').try(:[], 'Facebook') if self.fb_addr.blank?
|
93
|
+
self.vk_addr = info.try(:[], 'urls').try(:[], 'Vkontakte') if self.vk_addr.blank?
|
94
|
+
self.tw_addr = info.try(:[], 'urls').try(:[], 'Twitter') if self.tw_addr.blank?
|
95
|
+
self.ok_addr = info.try(:[], 'urls').try(:[], 'Odnoklassniki') if self.ok_addr.blank?
|
96
|
+
|
97
|
+
self.save
|
98
|
+
end
|
99
|
+
|
100
|
+
private
|
101
|
+
|
102
|
+
# OAUTH helpers
|
103
|
+
|
104
|
+
def oauth?; !oauth_data.blank?; end
|
105
|
+
|
106
|
+
def oauth_params
|
107
|
+
@oauth_params ||= (begin; JSON.parse oauth_data; rescue; nil; end)
|
108
|
+
end
|
109
|
+
|
110
|
+
def info
|
111
|
+
@info ||= oauth_params.try(:[], 'info')
|
112
|
+
end
|
113
|
+
|
114
|
+
def extra
|
115
|
+
@extra ||= oauth_params.try(:[], 'extra')
|
116
|
+
end
|
117
|
+
|
118
|
+
def raw_info
|
119
|
+
@raw_info ||= oauth_params.try(:[], 'extra').try(:[], 'raw_info')
|
120
|
+
end
|
121
|
+
|
122
|
+
# base methods
|
123
|
+
|
124
|
+
SocialNetworksLogin::Base.networks_list.each do |network_name|
|
125
|
+
define_method "#{ network_name }_oauth?" do
|
126
|
+
oauth_params['provider'] == network_name
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
def create_credential
|
131
|
+
uid = oauth_params['uid']
|
132
|
+
provider = oauth_params['provider']
|
133
|
+
_credentials = oauth_params.try(:[], 'credentials')
|
134
|
+
|
135
|
+
create_credential_with_oauth(uid, provider, _credentials)
|
136
|
+
end
|
137
|
+
|
138
|
+
def define_login
|
139
|
+
# generate by oauth data
|
140
|
+
self.login = info.try(:[], 'nickname') if self.login.blank?
|
141
|
+
self.login = raw_info.try(:[], 'screen_name') if self.login.blank?
|
142
|
+
|
143
|
+
# generate by username with number
|
144
|
+
if self.login.blank? && self.username.present?
|
145
|
+
login_counter = 0
|
146
|
+
_login = self.username.to_slug_param
|
147
|
+
|
148
|
+
while User.find_by_login(_login) do
|
149
|
+
login_counter += 1
|
150
|
+
_login = [ self.username.to_slug_param, login_counter ].join ?-
|
151
|
+
_login = nil && break if login_counter == attempts_to_generate
|
152
|
+
end
|
153
|
+
|
154
|
+
self.login = _login
|
155
|
+
end
|
156
|
+
|
157
|
+
# generate by random value
|
158
|
+
if self.login.blank?
|
159
|
+
self.login = "user-#{ SecureRandom.hex[0..4] }"
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
def define_email
|
164
|
+
# generate by oauth data
|
165
|
+
self.email = info.try(:[], 'email') if self.email.blank?
|
166
|
+
|
167
|
+
# generate by login with number
|
168
|
+
if self.email.blank? && self.login.present?
|
169
|
+
email_counter = 0
|
170
|
+
_email = [ self.login, default_email_domain ].join ?@
|
171
|
+
|
172
|
+
while User.find_by_email(_email) do
|
173
|
+
email_counter += 1
|
174
|
+
_email = [ "#{ self.login }-#{ email_counter }", default_email_domain ].join ?@
|
175
|
+
_email = nil && break if email_counter == attempts_to_generate
|
176
|
+
end
|
177
|
+
|
178
|
+
self.email = _email
|
179
|
+
end
|
180
|
+
|
181
|
+
# generate by random value
|
182
|
+
if self.email.blank?
|
183
|
+
self.email = "#{ SecureRandom.hex[0..6] }@#{ default_email_domain }"
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
def define_password
|
188
|
+
self.password = SecureRandom.hex[0..10]
|
189
|
+
end
|
190
|
+
|
191
|
+
def upload_oauth_avatar
|
192
|
+
default_image = info.try(:[], 'image')
|
193
|
+
gp_avatar, fb_avatar, tw_avatar = Array.new(3, default_image)
|
194
|
+
|
195
|
+
vk_avatar = raw_info.try(:[], 'photo_200_orig')
|
196
|
+
|
197
|
+
if facebook_oauth?
|
198
|
+
json = JSON.parse(Net::HTTP.get(URI.parse(fb_avatar.gsub('&redirect=false', '') + '?type=large&redirect=false')))
|
199
|
+
unless json['data']['is_silhouette']
|
200
|
+
self.avatar = json['data']['url']
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
if twitter_oauth?
|
205
|
+
self.avatar = tw_avatar.gsub('_normal', '')
|
206
|
+
end
|
207
|
+
|
208
|
+
if vkontakte_oauth?
|
209
|
+
self.avatar = vk_avatar
|
210
|
+
end
|
211
|
+
|
212
|
+
if google_oauth2_oauth?
|
213
|
+
self.avatar = gp_avatar.gsub('s50', 's200').gsub('sz=50', 'sz=200')
|
214
|
+
end
|
215
|
+
|
216
|
+
if odnoklassniki_oauth?
|
217
|
+
self.avatar = raw_info.try(:[], 'pic_2')
|
218
|
+
end
|
219
|
+
|
220
|
+
reset_oauth_data!
|
221
|
+
save
|
222
|
+
end
|
223
|
+
|
224
|
+
def reset_oauth_data!
|
225
|
+
self.oauth_data, @oauth_params = [nil, nil]
|
226
|
+
end
|
227
|
+
end
|
228
|
+
end
|
229
|
+
end
|
data/gem_version.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require_relative '../../gem_version'
|
@@ -0,0 +1,472 @@
|
|
1
|
+
# SPEC EXAMPLE
|
2
|
+
|
3
|
+
ENV["RAILS_ENV"] ||= 'development'
|
4
|
+
require File.expand_path("../../../config/environment", __FILE__)
|
5
|
+
|
6
|
+
def create_user_without_oauth
|
7
|
+
puts "Without OAUTH"
|
8
|
+
user = User.create
|
9
|
+
puts user.errors.to_a
|
10
|
+
end
|
11
|
+
|
12
|
+
def create_user_with_facebook_oauth
|
13
|
+
# Facebook
|
14
|
+
json_data = '{
|
15
|
+
"provider":"facebook",
|
16
|
+
"uid":"100100100",
|
17
|
+
"info":{
|
18
|
+
"email":"killich@ya.ru",
|
19
|
+
"name":"Илья Зыкин",
|
20
|
+
"first_name":"Илья",
|
21
|
+
"last_name":"Зыкин",
|
22
|
+
"image":"http://graph.facebook.com/10202934219094389/picture&redirect=false",
|
23
|
+
"urls":{
|
24
|
+
"Facebook":"https://www.facebook.com/app_scoped_user_id/100100100/"
|
25
|
+
},
|
26
|
+
"verified":true
|
27
|
+
},
|
28
|
+
"credentials":{
|
29
|
+
"token":"my_tocken1000",
|
30
|
+
"expires_at":1405950180,
|
31
|
+
"expires":true
|
32
|
+
},
|
33
|
+
"extra":{
|
34
|
+
"raw_info":{
|
35
|
+
"id":"100100100",
|
36
|
+
"email":"killich@ya.ru",
|
37
|
+
"first_name":"Илья",
|
38
|
+
"gender":"male",
|
39
|
+
"last_name":"Зыкин",
|
40
|
+
"link":"https://www.facebook.com/app_scoped_user_id/100100100/",
|
41
|
+
"locale":"ru_RU",
|
42
|
+
"name":"Илья Зыкин",
|
43
|
+
"timezone":4,
|
44
|
+
"updated_time":"2014-05-22T12:14:08+0000",
|
45
|
+
"verified":true
|
46
|
+
}
|
47
|
+
}
|
48
|
+
}'
|
49
|
+
|
50
|
+
puts "With OAUTH"
|
51
|
+
user = User.create(oauth_data: json_data)
|
52
|
+
puts user.errors.to_a
|
53
|
+
end
|
54
|
+
|
55
|
+
def create_user_with_vk_oauth
|
56
|
+
# VKONTAKTE
|
57
|
+
json_data = '{
|
58
|
+
"provider":"vkontakte",
|
59
|
+
"uid":"100100100",
|
60
|
+
"info":{
|
61
|
+
"name":"Илья Николаевич",
|
62
|
+
"nickname":"",
|
63
|
+
"first_name":"Илья",
|
64
|
+
"last_name":"Николаевич",
|
65
|
+
"image":"http://cs304109.vk.me/v304109742/605e/mgMMsogBxLo.jpg",
|
66
|
+
"location":"Россия, Санкт-Петербург",
|
67
|
+
"urls":{
|
68
|
+
"Vkontakte":"http://vk.com/izzizzi"
|
69
|
+
}
|
70
|
+
},
|
71
|
+
"credentials":{
|
72
|
+
"token":"test_token",
|
73
|
+
"expires_at":1400935708,
|
74
|
+
"expires":true
|
75
|
+
},
|
76
|
+
"extra":{
|
77
|
+
"raw_info":{
|
78
|
+
"id":100100100,
|
79
|
+
"first_name":"Илья",
|
80
|
+
"last_name":"Николаевич",
|
81
|
+
"sex":2,
|
82
|
+
"nickname":"",
|
83
|
+
"screen_name":"izzizzi",
|
84
|
+
"bdate":"2.11.1984",
|
85
|
+
"city":2,
|
86
|
+
"country":1,
|
87
|
+
"photo_50":"http://cs304109.vk.me/v304109742/605e/mgMMsogBxLo.jpg",
|
88
|
+
"photo_100":"http://cs304109.vk.me/v304109742/605d/JNedY0oKESs.jpg",
|
89
|
+
"photo_200_orig":"http://cs304109.vk.me/v304109742/605b/AQrtEvxwZnM.jpg",
|
90
|
+
"online":1
|
91
|
+
}
|
92
|
+
}
|
93
|
+
}'
|
94
|
+
|
95
|
+
puts "With OAUTH"
|
96
|
+
user = User.create(oauth_data: json_data)
|
97
|
+
puts user.errors.to_a
|
98
|
+
end
|
99
|
+
|
100
|
+
def create_user_with_twitter_oauth
|
101
|
+
json_data = '{
|
102
|
+
"provider":"twitter",
|
103
|
+
"uid":"100100100",
|
104
|
+
"info":{
|
105
|
+
"nickname":"iam_teacher",
|
106
|
+
"name":"Илья Николаевич",
|
107
|
+
"location":"Питер",
|
108
|
+
"image":"http://pbs.twimg.com/profile_images/378800000801642062/07c6d6e7df7acc665af54172fb98494b_normal.jpeg",
|
109
|
+
"description":"Dreams on Rails",
|
110
|
+
"urls":{
|
111
|
+
"Website":"http://t.co/XE1VRDZXwr",
|
112
|
+
"Twitter":"https://twitter.com/iam_teacher"
|
113
|
+
}
|
114
|
+
},
|
115
|
+
"credentials":{
|
116
|
+
"token":"100100100-rHs4Yz9LPkhMEBXyeZxLWdfMZ6Qf30ySl40WaQs",
|
117
|
+
"secret":"e0UGMv4zsf2yit7TLpPoyZ0gHknWjtSn4u2jvkfDI12fW"
|
118
|
+
},
|
119
|
+
"extra":{
|
120
|
+
"access_token":{
|
121
|
+
"token":"100100100-rHs4Yz9LPkhMEBXyeZxLWdfMZ6Qf30ySl40WaQs",
|
122
|
+
"secret":"e0UGMv4zsf2yit7TLpPoyZ0gHknWjtSn4u2jvkfDI12fW",
|
123
|
+
"consumer":{
|
124
|
+
"key":"nOLguvZ6NFj142AUc4s1TZhby",
|
125
|
+
"secret":"ujWEH7rKF39EoTnJxzAHNx3dapaBzqQK67LDVd4ROP2AyaiYa8",
|
126
|
+
"options":{
|
127
|
+
"signature_method":"HMAC-SHA1",
|
128
|
+
"request_token_path":"/oauth/request_token",
|
129
|
+
"authorize_path":"/oauth/authenticate",
|
130
|
+
"access_token_path":"/oauth/access_token",
|
131
|
+
"proxy":null,
|
132
|
+
"scheme":"header",
|
133
|
+
"http_method":"post",
|
134
|
+
"oauth_version":"1.0",
|
135
|
+
"site":"https://api.twitter.com"
|
136
|
+
},
|
137
|
+
"http":{
|
138
|
+
"address":"api.twitter.com",
|
139
|
+
"port":443,
|
140
|
+
"local_host":null,
|
141
|
+
"local_port":null,
|
142
|
+
"curr_http_version":"1.1",
|
143
|
+
"keep_alive_timeout":2,
|
144
|
+
"last_communicated":null,
|
145
|
+
"close_on_empty_response":false,
|
146
|
+
"socket":null,
|
147
|
+
"started":false,
|
148
|
+
"open_timeout":30,
|
149
|
+
"read_timeout":30,
|
150
|
+
"continue_timeout":null,
|
151
|
+
"debug_output":null,
|
152
|
+
"proxy_from_env":true,
|
153
|
+
"proxy_uri":null,
|
154
|
+
"proxy_address":null,
|
155
|
+
"proxy_port":null,
|
156
|
+
"proxy_user":null,
|
157
|
+
"proxy_pass":null,
|
158
|
+
"use_ssl":true,
|
159
|
+
"ssl_context":{
|
160
|
+
"cert":null,
|
161
|
+
"key":null,
|
162
|
+
"client_ca":null,
|
163
|
+
"ca_file":null,
|
164
|
+
"ca_path":null,
|
165
|
+
"timeout":null,
|
166
|
+
"verify_mode":0,
|
167
|
+
"verify_depth":null,
|
168
|
+
"renegotiation_cb":null,
|
169
|
+
"verify_callback":null,
|
170
|
+
"options":-2147482625,
|
171
|
+
"cert_store":null,
|
172
|
+
"extra_chain_cert":null,
|
173
|
+
"client_cert_cb":null,
|
174
|
+
"tmp_dh_callback":null,
|
175
|
+
"session_id_context":null,
|
176
|
+
"session_get_cb":null,
|
177
|
+
"session_new_cb":null,
|
178
|
+
"session_remove_cb":null,
|
179
|
+
"servername_cb":null,
|
180
|
+
"npn_protocols":null,
|
181
|
+
"npn_select_cb":null
|
182
|
+
},
|
183
|
+
"ssl_session":{
|
184
|
+
|
185
|
+
},
|
186
|
+
"enable_post_connection_check":true,
|
187
|
+
"sspi_enabled":false,
|
188
|
+
"ca_file":null,
|
189
|
+
"ca_path":null,
|
190
|
+
"cert":null,
|
191
|
+
"cert_store":null,
|
192
|
+
"ciphers":null,
|
193
|
+
"key":null,
|
194
|
+
"ssl_timeout":null,
|
195
|
+
"ssl_version":null,
|
196
|
+
"verify_callback":null,
|
197
|
+
"verify_depth":null,
|
198
|
+
"verify_mode":0
|
199
|
+
},
|
200
|
+
"http_method":"post",
|
201
|
+
"uri":{
|
202
|
+
"scheme":"https",
|
203
|
+
"user":null,
|
204
|
+
"password":null,
|
205
|
+
"host":"api.twitter.com",
|
206
|
+
"port":443,
|
207
|
+
"path":"",
|
208
|
+
"query":null,
|
209
|
+
"opaque":null,
|
210
|
+
"registry":null,
|
211
|
+
"fragment":null,
|
212
|
+
"parser":null
|
213
|
+
}
|
214
|
+
},
|
215
|
+
"params":{
|
216
|
+
"oauth_token":"100100100-rHs4Yz9LPkhMEBXyeZxLWdfMZ6Qf30ySl40WaQs",
|
217
|
+
"oauth_token_secret":"e0UGMv4zsf2yit7TLpPoyZ0gHknWjtSn4u2jvkfDI12fW",
|
218
|
+
"user_id":"100100100",
|
219
|
+
"screen_name":"iam_teacher"
|
220
|
+
},
|
221
|
+
"response":{
|
222
|
+
"cache-control":[
|
223
|
+
"no-cache, no-store, must-revalidate, pre-check=0, post-check=0"
|
224
|
+
],
|
225
|
+
"content-length":[
|
226
|
+
"653"
|
227
|
+
],
|
228
|
+
"content-type":[
|
229
|
+
"application/json;charset=utf-8"
|
230
|
+
],
|
231
|
+
"date":[
|
232
|
+
"Fri, 23 May 2014 12:56:48 GMT"
|
233
|
+
],
|
234
|
+
"expires":[
|
235
|
+
"Tue, 31 Mar 1981 05:00:00 GMT"
|
236
|
+
],
|
237
|
+
"last-modified":[
|
238
|
+
"Fri, 23 May 2014 12:56:48 GMT"
|
239
|
+
],
|
240
|
+
"pragma":[
|
241
|
+
"no-cache"
|
242
|
+
],
|
243
|
+
"server":[
|
244
|
+
"tfe"
|
245
|
+
],
|
246
|
+
"set-cookie":[
|
247
|
+
"lang=ru",
|
248
|
+
"guest_id=v1%3A140084980831930062; Domain=.twitter.com; Path=/; Expires=Sun, 22-May-2016 12:56:48 UTC"
|
249
|
+
],
|
250
|
+
"status":[
|
251
|
+
"200 OK"
|
252
|
+
],
|
253
|
+
"strict-transport-security":[
|
254
|
+
"max-age=631138519"
|
255
|
+
],
|
256
|
+
"x-access-level":[
|
257
|
+
"read"
|
258
|
+
],
|
259
|
+
"x-content-type-options":[
|
260
|
+
"nosniff"
|
261
|
+
],
|
262
|
+
"x-frame-options":[
|
263
|
+
"SAMEORIGIN"
|
264
|
+
],
|
265
|
+
"x-rate-limit-limit":[
|
266
|
+
"15"
|
267
|
+
],
|
268
|
+
"x-rate-limit-remaining":[
|
269
|
+
"14"
|
270
|
+
],
|
271
|
+
"x-rate-limit-reset":[
|
272
|
+
"1400850708"
|
273
|
+
],
|
274
|
+
"x-transaction":[
|
275
|
+
"b072b432de4625c6"
|
276
|
+
],
|
277
|
+
"x-xss-protection":[
|
278
|
+
"1; mode=block"
|
279
|
+
],
|
280
|
+
"connection":[
|
281
|
+
"close"
|
282
|
+
]
|
283
|
+
}
|
284
|
+
},
|
285
|
+
"raw_info":{
|
286
|
+
"id":100100100,
|
287
|
+
"id_str":"100100100",
|
288
|
+
"name":"Илья Николаевич",
|
289
|
+
"screen_name":"iam_teacher",
|
290
|
+
"location":"Питер",
|
291
|
+
"description":"Dreams on Rails",
|
292
|
+
"url":"http://t.co/XE1VRDZXwr",
|
293
|
+
"entities":{
|
294
|
+
"url":{
|
295
|
+
"urls":[
|
296
|
+
{
|
297
|
+
"url":"http://t.co/XE1VRDZXwr",
|
298
|
+
"expanded_url":"http://open-cook.ru",
|
299
|
+
"display_url":"open-cook.ru",
|
300
|
+
"indices":[
|
301
|
+
0,
|
302
|
+
22
|
303
|
+
]
|
304
|
+
}
|
305
|
+
]
|
306
|
+
},
|
307
|
+
"description":{
|
308
|
+
"urls":[
|
309
|
+
|
310
|
+
]
|
311
|
+
}
|
312
|
+
},
|
313
|
+
"protected":false,
|
314
|
+
"followers_count":17,
|
315
|
+
"friends_count":43,
|
316
|
+
"listed_count":0,
|
317
|
+
"created_at":"Sat Sep 21 19:26:54 +0000 2013",
|
318
|
+
"favourites_count":1,
|
319
|
+
"utc_offset":null,
|
320
|
+
"time_zone":null,
|
321
|
+
"geo_enabled":false,
|
322
|
+
"verified":false,
|
323
|
+
"statuses_count":45,
|
324
|
+
"lang":"ru",
|
325
|
+
"contributors_enabled":false,
|
326
|
+
"is_translator":false,
|
327
|
+
"is_translation_enabled":false,
|
328
|
+
"profile_background_color":"C0DEED",
|
329
|
+
"profile_background_image_url":"http://abs.twimg.com/images/themes/theme1/bg.png",
|
330
|
+
"profile_background_image_url_https":"https://abs.twimg.com/images/themes/theme1/bg.png",
|
331
|
+
"profile_background_tile":false,
|
332
|
+
"profile_image_url":"http://pbs.twimg.com/profile_images/378800000801642062/07c6d6e7df7acc665af54172fb98494b_normal.jpeg",
|
333
|
+
"profile_image_url_https":"https://pbs.twimg.com/profile_images/378800000801642062/07c6d6e7df7acc665af54172fb98494b_normal.jpeg",
|
334
|
+
"profile_link_color":"0084B4",
|
335
|
+
"profile_sidebar_border_color":"C0DEED",
|
336
|
+
"profile_sidebar_fill_color":"DDEEF6",
|
337
|
+
"profile_text_color":"333333",
|
338
|
+
"profile_use_background_image":true,
|
339
|
+
"default_profile":true,
|
340
|
+
"default_profile_image":false,
|
341
|
+
"following":false,
|
342
|
+
"follow_request_sent":false,
|
343
|
+
"notifications":false
|
344
|
+
}
|
345
|
+
}
|
346
|
+
}'
|
347
|
+
|
348
|
+
puts "With OAUTH"
|
349
|
+
user = User.create(oauth_data: json_data)
|
350
|
+
puts user.errors.to_a
|
351
|
+
end
|
352
|
+
|
353
|
+
def create_user_with_google_oauth
|
354
|
+
json_data = '{
|
355
|
+
"provider":"google_oauth2",
|
356
|
+
"uid":"100100100",
|
357
|
+
"info":{
|
358
|
+
"name":"Илья Николаевич",
|
359
|
+
"email":"gkillich@gmail.com",
|
360
|
+
"first_name":"Илья",
|
361
|
+
"last_name":"Николаевич",
|
362
|
+
"image":"https://lh6.googleusercontent.com/-_4nOVdM7f7U/AAAAAAAAAAI/AAAAAAAAAEE/ju9NEnysXHw/s50/photo.jpg?sz=50",
|
363
|
+
"urls":{
|
364
|
+
"Google":"https://plus.google.com/100100100"
|
365
|
+
}
|
366
|
+
},
|
367
|
+
"credentials":{
|
368
|
+
"token":"token",
|
369
|
+
"expires_at":1400854629,
|
370
|
+
"expires":true
|
371
|
+
},
|
372
|
+
"extra":{
|
373
|
+
"id_token":"tken--J0kytfs",
|
374
|
+
"raw_info":{
|
375
|
+
"kind":"plus#personOpenIdConnect",
|
376
|
+
"gender":"male",
|
377
|
+
"sub":"100100100",
|
378
|
+
"name":"Илья Николаевич",
|
379
|
+
"given_name":"Илья",
|
380
|
+
"family_name":"Николаевич",
|
381
|
+
"profile":"https://plus.google.com/100100100",
|
382
|
+
"picture":"https:https://lh6.googleusercontent.com/-_4nOVdM7f7U/AAAAAAAAAAI/AAAAAAAAAEE/ju9NEnysXHw/photo.jpg?sz=50",
|
383
|
+
"email":"gkillich@gmail.com",
|
384
|
+
"email_verified":"true",
|
385
|
+
"locale":"ru"
|
386
|
+
}
|
387
|
+
}
|
388
|
+
}'
|
389
|
+
|
390
|
+
puts "With OAUTH"
|
391
|
+
user = User.create(oauth_data: json_data)
|
392
|
+
puts user.errors.to_a
|
393
|
+
end
|
394
|
+
|
395
|
+
def create_user_with_ok_oauth
|
396
|
+
json_data = {
|
397
|
+
"provider" => "odnoklassniki",
|
398
|
+
"uid" => "100100100",
|
399
|
+
"info" =>
|
400
|
+
{
|
401
|
+
"name" => "Илья Николаевич",
|
402
|
+
"first_name" => "Илья",
|
403
|
+
"last_name" => "Николаевич",
|
404
|
+
"image" => "http://i500.mycdn.me/getImage?photoId=575482180985&photoType=4&viewToken=0o2ycgAO8MnOCYN6vg9leg",
|
405
|
+
"urls" => {
|
406
|
+
"Odnoklassniki" => "http://www.odnoklassniki.ru/profile/100100100"
|
407
|
+
}
|
408
|
+
},
|
409
|
+
"credentials" => {
|
410
|
+
"token" => "bvipa.628k1rpp3k3bsr9asda3df",
|
411
|
+
"refresh_token" => "a914766d0d3985eec",
|
412
|
+
"expires_at" => 1410968541,
|
413
|
+
"expires" => true
|
414
|
+
},
|
415
|
+
"extra" => {
|
416
|
+
"raw_info" => {
|
417
|
+
"uid" => "100100100",
|
418
|
+
"birthday" => "1984-11-02",
|
419
|
+
"age" => 29,
|
420
|
+
|
421
|
+
"first_name" => "Илья",
|
422
|
+
"last_name" => "Николаевич",
|
423
|
+
"name" => "Илья Николаевич",
|
424
|
+
|
425
|
+
"locale" => "ru",
|
426
|
+
"gender" => "male",
|
427
|
+
"has_email" => true,
|
428
|
+
"location" => {
|
429
|
+
"city" => "Санкт-Петербург",
|
430
|
+
"country" => "RUSSIAN_FEDERATION",
|
431
|
+
"countryCode" => "RU",
|
432
|
+
"countryName" => "Россия"
|
433
|
+
},
|
434
|
+
|
435
|
+
"current_status" => "Православный Невский )))",
|
436
|
+
"current_status_id" => "6206253",
|
437
|
+
"current_status_date" => "2014-09-12 12:05:10",
|
438
|
+
"online" => "web",
|
439
|
+
"photo_id" => "575482180985",
|
440
|
+
"pic_1" => "http://i500.mycdn.me/getImage?photoId=575482180985&photoType=4&viewToken=0o2ycgAO8MnOCYN6vg9leg",
|
441
|
+
"pic_2" => "http://usd1.mycdn.me/getImage?photoId=575482180985&photoType=2&viewToken=0o2ycgAO8MnOCYN6vg9leg"
|
442
|
+
}
|
443
|
+
}
|
444
|
+
}.to_json
|
445
|
+
|
446
|
+
puts "With OAUTH"
|
447
|
+
user = User.create(oauth_data: json_data)
|
448
|
+
puts user.errors.to_a
|
449
|
+
end
|
450
|
+
|
451
|
+
# create_user_without_oauth
|
452
|
+
|
453
|
+
create_user_with_facebook_oauth
|
454
|
+
puts "FB: #{ User.last.login }"
|
455
|
+
puts "FB: #{ User.last.email }"
|
456
|
+
|
457
|
+
create_user_with_vk_oauth
|
458
|
+
puts "VK: #{ User.last.login }"
|
459
|
+
puts "VK: #{ User.last.email }"
|
460
|
+
|
461
|
+
create_user_with_twitter_oauth
|
462
|
+
puts "TW: #{ User.last.login }"
|
463
|
+
puts "TW: #{ User.last.email }"
|
464
|
+
|
465
|
+
create_user_with_google_oauth
|
466
|
+
puts "G+: #{ User.last.login }"
|
467
|
+
puts "G+: #{ User.last.email }"
|
468
|
+
|
469
|
+
create_user_with_ok_oauth
|
470
|
+
puts "OK: #{ User.last.login }"
|
471
|
+
puts "OK: #{ User.last.email }"
|
472
|
+
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'the_social_login/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "the_social_login"
|
8
|
+
spec.version = TheSocialLogin::VERSION
|
9
|
+
spec.authors = ["Ilya N. Zykin"]
|
10
|
+
spec.email = ["zykin-ilya@ya.ru"]
|
11
|
+
spec.summary = %q{Model concern for OAuth}
|
12
|
+
spec.description = %q{Parse OAuth data}
|
13
|
+
spec.homepage = "https://github.com/TheProfitCMS/the_social_login"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.6"
|
22
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
23
|
+
spec.add_development_dependency "the_string_to_slug", "~> 1.2"
|
24
|
+
end
|
metadata
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: the_social_login
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ilya N. Zykin
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-10-26 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.6'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.6'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: the_string_to_slug
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.2'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.2'
|
55
|
+
description: Parse OAuth data
|
56
|
+
email:
|
57
|
+
- zykin-ilya@ya.ru
|
58
|
+
executables: []
|
59
|
+
extensions: []
|
60
|
+
extra_rdoc_files: []
|
61
|
+
files:
|
62
|
+
- ".gitignore"
|
63
|
+
- Gemfile
|
64
|
+
- LICENSE.txt
|
65
|
+
- README.md
|
66
|
+
- Rakefile
|
67
|
+
- app/models/concerns/social_networks_login_base.rb
|
68
|
+
- gem_version.rb
|
69
|
+
- lib/the_social_login.rb
|
70
|
+
- lib/the_social_login/version.rb
|
71
|
+
- spec/oauth_registration.rb
|
72
|
+
- the_social_login.gemspec
|
73
|
+
homepage: https://github.com/TheProfitCMS/the_social_login
|
74
|
+
licenses:
|
75
|
+
- MIT
|
76
|
+
metadata: {}
|
77
|
+
post_install_message:
|
78
|
+
rdoc_options: []
|
79
|
+
require_paths:
|
80
|
+
- lib
|
81
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
82
|
+
requirements:
|
83
|
+
- - ">="
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - ">="
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
91
|
+
requirements: []
|
92
|
+
rubyforge_project:
|
93
|
+
rubygems_version: 2.2.2
|
94
|
+
signing_key:
|
95
|
+
specification_version: 4
|
96
|
+
summary: Model concern for OAuth
|
97
|
+
test_files:
|
98
|
+
- spec/oauth_registration.rb
|