socialite 0.1.0.pre.3 → 0.1.0.pre.4
Sign up to get free protection for your applications and to get access to all the features.
- data/app/controllers/socialite/sessions_controller.rb +15 -10
- data/app/controllers/socialite/socialite_controller.rb +9 -0
- data/app/controllers/socialite/users_controller.rb +4 -1
- data/app/views/layouts/socialite/{application.html.haml → socialite.html.haml} +0 -2
- data/lib/socialite/controllers/helpers.rb +39 -1
- data/lib/socialite/models/user_concern.rb +13 -1
- data/lib/socialite/version.rb +1 -1
- data/spec/features/facebook_registration_spec.rb +1 -1
- data/spec/features/identity_registration_spec.rb +1 -1
- data/spec/models/user_spec.rb +25 -1
- data/spec/support/omniauth.rb +36 -9
- metadata +5 -5
- data/app/controllers/socialite/application_controller.rb +0 -4
@@ -1,9 +1,14 @@
|
|
1
1
|
module Socialite
|
2
|
-
class SessionsController <
|
2
|
+
class SessionsController < SocialiteController
|
3
3
|
unloadable
|
4
4
|
|
5
|
+
before_filter :ensure_user, only: [:destroy]
|
6
|
+
|
7
|
+
# Login Page
|
5
8
|
def new
|
6
|
-
|
9
|
+
if current_user
|
10
|
+
redirect_to main_app.root_path, :alert => 'You are already registered.'
|
11
|
+
end
|
7
12
|
end
|
8
13
|
|
9
14
|
def create
|
@@ -17,20 +22,20 @@ module Socialite
|
|
17
22
|
# account. But we found the identity and the user associated with it
|
18
23
|
# is the current user. So the identity is already associated with
|
19
24
|
# this user. So let's display an error message.
|
20
|
-
redirect_to
|
25
|
+
redirect_to after_link_path, :notice => "You have already linked this account"
|
21
26
|
else
|
22
27
|
# The identity is not associated with the current_user so lets
|
23
28
|
# associate the identity.
|
24
29
|
@identity.user = current_user
|
25
30
|
@identity.save
|
26
|
-
redirect_to
|
31
|
+
redirect_to after_link_path, :notice => "Account successfully authenticated"
|
27
32
|
end
|
28
33
|
else # User is not logged in, this is a new signin
|
29
34
|
if @identity.user.present?
|
30
35
|
# The identity we found had a user associated with it so let's
|
31
36
|
# just log them in here
|
32
37
|
self.current_user = @identity.user
|
33
|
-
redirect_to
|
38
|
+
redirect_to after_login_path, :notice => "Signed in!"
|
34
39
|
else
|
35
40
|
# The authentication has no user assigned and there is no user signed in
|
36
41
|
# Our decision here is to create a new account for the user
|
@@ -42,14 +47,14 @@ module Socialite
|
|
42
47
|
# So we just load it up
|
43
48
|
else
|
44
49
|
# otherwise we have to create a user with the auth hash
|
45
|
-
Socialite.user_class.
|
50
|
+
Socialite.user_class.find_or_create_from_omniauth(auth)
|
46
51
|
# NOTE: we will handle the different types of data we get back
|
47
52
|
# from providers at the model level in create_from_omniauth
|
48
53
|
end
|
49
54
|
# We can now link the authentication with the user and log him in
|
50
55
|
user.identities << @identity
|
51
56
|
self.current_user = user
|
52
|
-
redirect_to
|
57
|
+
redirect_to after_signup_path, notice: "Welcome to the app!"
|
53
58
|
|
54
59
|
# No user associated with the identity so we need to create a new one
|
55
60
|
# redirect_to new_user_url, :notice => "Please finish registering"
|
@@ -58,12 +63,12 @@ module Socialite
|
|
58
63
|
end
|
59
64
|
|
60
65
|
def destroy
|
61
|
-
|
62
|
-
redirect_to
|
66
|
+
logout!
|
67
|
+
redirect_to(main_app.root_url, :notice => 'Signed out!')
|
63
68
|
end
|
64
69
|
|
65
70
|
def failure
|
66
|
-
redirect_to
|
71
|
+
redirect_to after_failure_path, :alert => "Authentication failed, please try again."
|
67
72
|
end
|
68
73
|
end
|
69
74
|
end
|
@@ -1,8 +1,11 @@
|
|
1
1
|
module Socialite
|
2
|
-
class UsersController <
|
2
|
+
class UsersController < SocialiteController
|
3
3
|
unloadable
|
4
4
|
|
5
5
|
def new
|
6
|
+
if current_user
|
7
|
+
redirect_to main_app.root_path, notice: 'You are already registered.'
|
8
|
+
end
|
6
9
|
@user = env['omniauth.identity'] ||= Socialite.user_class.new
|
7
10
|
end
|
8
11
|
end
|
@@ -8,7 +8,25 @@ module Socialite
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def current_user
|
11
|
-
@current_user ||=
|
11
|
+
@current_user ||= if session.has_key?(:user_id)
|
12
|
+
Socialite.user_class.find(session[:user_id])
|
13
|
+
end
|
14
|
+
rescue ActiveRecord::RecordNotFound
|
15
|
+
session[:user_id] = nil
|
16
|
+
end
|
17
|
+
|
18
|
+
def ensure_user
|
19
|
+
if defined?(super)
|
20
|
+
super
|
21
|
+
else
|
22
|
+
unless user_signed_in?
|
23
|
+
redirect_to login_path, :alert => 'You must be logged in to use this feature.'
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def logout!
|
29
|
+
self.current_user = nil and session.destroy
|
12
30
|
end
|
13
31
|
|
14
32
|
def user_signed_in?
|
@@ -19,6 +37,26 @@ module Socialite
|
|
19
37
|
@current_user = user
|
20
38
|
session[:user_id] = user.nil? ? user : user.id
|
21
39
|
end
|
40
|
+
|
41
|
+
def after_link_path
|
42
|
+
main_app.root_path
|
43
|
+
end
|
44
|
+
|
45
|
+
def after_signup_path
|
46
|
+
main_app.root_path
|
47
|
+
end
|
48
|
+
|
49
|
+
def after_failure_path
|
50
|
+
main_app.root_path
|
51
|
+
end
|
52
|
+
|
53
|
+
def after_login_path
|
54
|
+
main_app.root_path
|
55
|
+
end
|
56
|
+
|
57
|
+
def after_logout_path
|
58
|
+
main_app.root_path
|
59
|
+
end
|
22
60
|
end
|
23
61
|
end
|
24
62
|
end
|
@@ -9,7 +9,6 @@ module Socialite
|
|
9
9
|
include OmniAuth::Identity::SecurePassword
|
10
10
|
|
11
11
|
included do
|
12
|
-
|
13
12
|
attr_accessible :email, :name, :password, :password_confirmation
|
14
13
|
|
15
14
|
has_secure_password if defined?(BCrypt)
|
@@ -29,10 +28,23 @@ module Socialite
|
|
29
28
|
# include OmniAuth::Identity::Model#::ClassMethods
|
30
29
|
# include OmniAuth::Identity::SecurePassword::ClassMethods
|
31
30
|
|
31
|
+
def find_from_omniauth(auth)
|
32
|
+
if auth['info']['email']
|
33
|
+
find_by_email(auth['info']['email'])
|
34
|
+
else
|
35
|
+
find_by_email("#{auth['info']['name']}@#{auth['provider']}.com")
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def find_or_create_from_omniauth(auth)
|
40
|
+
find_from_omniauth(auth) || create_from_omniauth(auth)
|
41
|
+
end
|
42
|
+
|
32
43
|
def create_from_omniauth(auth)
|
33
44
|
create do |user|
|
34
45
|
user.name = auth['info']['name']
|
35
46
|
user.email = auth['info']['email']
|
47
|
+
user.email ||= "#{auth['info']['nickname']}@#{auth['provider']}.com"
|
36
48
|
user.password ||= rand(36**10).to_s(36)
|
37
49
|
end
|
38
50
|
end
|
data/lib/socialite/version.rb
CHANGED
@@ -24,7 +24,7 @@ feature "Identity Registration" do
|
|
24
24
|
fill_in 'password', :with => 'secrets'
|
25
25
|
fill_in 'password_confirmation', :with => 'secrets'
|
26
26
|
click_button 'Sign Up'
|
27
|
-
page.should have_text 'Welcome to
|
27
|
+
page.should have_text 'Welcome to the app!'
|
28
28
|
page.should have_no_css('.error')
|
29
29
|
page.should have_no_button('Sign Up')
|
30
30
|
end
|
data/spec/models/user_spec.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe User do
|
3
|
+
describe User, :omniauth => true do
|
4
4
|
let(:linked_user) { FactoryGirl.create(:linked_user) }
|
5
5
|
|
6
6
|
it { should have_many(:identities).dependent(:destroy) }
|
@@ -11,6 +11,30 @@ describe User do
|
|
11
11
|
|
12
12
|
it { should have_db_index(:email).unique(true) }
|
13
13
|
|
14
|
+
it { should validate_uniqueness_of(:email).case_insensitive }
|
15
|
+
|
16
|
+
context 'existing users' do
|
17
|
+
let!(:twitter_user) { FactoryGirl.create(:user, email: 'johndoe@twitter.com') }
|
18
|
+
|
19
|
+
describe 'finding existing instead of creating additional' do
|
20
|
+
subject { described_class.find_or_create_from_omniauth(OmniAuth.config.mock_auth[:twitter]) }
|
21
|
+
|
22
|
+
its(:email) { should eql('johndoe@twitter.com') }
|
23
|
+
|
24
|
+
it 'retrieved the record; and did not create an additional one' do
|
25
|
+
lambda { subject }.should_not change(described_class, :count)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe 'creating user if finder fails' do
|
30
|
+
subject { described_class.find_or_create_from_omniauth(OmniAuth.config.mock_auth[:facebook]) }
|
31
|
+
|
32
|
+
it 'returns a new record' do
|
33
|
+
lambda { subject }.should change(described_class, :count).by(1)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
14
38
|
context 'with associated identities' do
|
15
39
|
subject { linked_user }
|
16
40
|
|
data/spec/support/omniauth.rb
CHANGED
@@ -12,20 +12,47 @@ RSpec.configure do |config|
|
|
12
12
|
# }
|
13
13
|
|
14
14
|
OmniAuth.config.add_mock(:facebook, {
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
15
|
+
:uid => '1234567',
|
16
|
+
:info => {
|
17
|
+
:nickname => 'jbloggs',
|
18
|
+
:email => 'joe@bloggs.com',
|
19
|
+
:name => 'Joe Bloggs',
|
20
|
+
:first_name => 'Joe',
|
21
|
+
:last_name => 'Bloggs',
|
22
|
+
:image => 'http://graph.facebook.com/1234567/picture?type=square',
|
23
|
+
:urls => { :Facebook => 'http://www.facebook.com/jbloggs' },
|
24
|
+
:location => 'Palo Alto, California',
|
25
|
+
:verified => true
|
26
|
+
},
|
27
|
+
:credentials => {
|
28
|
+
:token => 'ABCDEF...', # OAuth 2.0 access_token, which you may wish to store
|
29
|
+
:expires_at => 1321747205, # when the access token expires (it always will)
|
30
|
+
:expires => true # this will always be true
|
31
|
+
},
|
32
|
+
:extra => {
|
33
|
+
:raw_info => {
|
34
|
+
:id => '1234567',
|
35
|
+
:name => 'Joe Bloggs',
|
36
|
+
:first_name => 'Joe',
|
37
|
+
:last_name => 'Bloggs',
|
38
|
+
:link => 'http://www.facebook.com/jbloggs',
|
39
|
+
:username => 'jbloggs',
|
40
|
+
:location => { :id => '123456789', :name => 'Palo Alto, California' },
|
41
|
+
:gender => 'male',
|
42
|
+
:email => 'joe@bloggs.com',
|
43
|
+
:timezone => -8,
|
44
|
+
:locale => 'en_US',
|
45
|
+
:verified => true,
|
46
|
+
:updated_time => '2011-11-11T06:21:03+0000'
|
22
47
|
}
|
23
48
|
}
|
24
49
|
})
|
25
50
|
|
26
51
|
OmniAuth.config.add_mock(:twitter, {
|
27
|
-
:uid => '
|
28
|
-
:
|
52
|
+
:uid => '1337',
|
53
|
+
:info => {
|
54
|
+
:name => 'johndoe'
|
55
|
+
}
|
29
56
|
})
|
30
57
|
end
|
31
58
|
|
metadata
CHANGED
@@ -2,14 +2,14 @@
|
|
2
2
|
name: socialite
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease: 6
|
5
|
-
version: 0.1.0.pre.
|
5
|
+
version: 0.1.0.pre.4
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Justin Smestad
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-02-
|
12
|
+
date: 2013-02-22 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -309,10 +309,10 @@ files:
|
|
309
309
|
- app/assets/images/socialite/twitter_64.png
|
310
310
|
- app/assets/stylesheets/socialite/socialite.css
|
311
311
|
- app/assets/stylesheets/socialite.css
|
312
|
-
- app/controllers/socialite/application_controller.rb
|
313
312
|
- app/controllers/socialite/sessions_controller.rb
|
313
|
+
- app/controllers/socialite/socialite_controller.rb
|
314
314
|
- app/controllers/socialite/users_controller.rb
|
315
|
-
- app/views/layouts/socialite/
|
315
|
+
- app/views/layouts/socialite/socialite.html.haml
|
316
316
|
- app/views/socialite/identities/_identities.html.haml
|
317
317
|
- app/views/socialite/identities/new.html.haml
|
318
318
|
- app/views/socialite/sessions/new.html.haml
|
@@ -409,7 +409,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
409
409
|
- !ruby/object:Gem::Version
|
410
410
|
segments:
|
411
411
|
- 0
|
412
|
-
hash:
|
412
|
+
hash: -4137053781704472879
|
413
413
|
version: '0'
|
414
414
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
415
415
|
none: false
|