devise_facebook_connectable 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
@@ -22,22 +22,22 @@ require 'devise_facebook_connectable/routes'
|
|
22
22
|
require 'devise_facebook_connectable/view_helpers'
|
23
23
|
|
24
24
|
module Devise
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
25
|
+
# Specifies the name of the database column name used for storing
|
26
|
+
# the user Facebook UID. Useful if this info should be saved in a
|
27
|
+
# generic column if different authentication solutions are used.
|
28
|
+
mattr_accessor :facebook_uid_field
|
29
|
+
@@facebook_uid_field = :facebook_uid
|
30
|
+
|
31
|
+
# Specifies the name of the database column name used for storing
|
32
|
+
# the user Facebook session key. Useful if this info should be saved in a
|
33
|
+
# generic column if different authentication solutions are used.
|
34
|
+
mattr_accessor :facebook_session_key_field
|
35
|
+
@@facebook_session_key_field = :facebook_session_key
|
36
|
+
|
37
|
+
# Specifies if account should be created if no account exists for
|
38
|
+
# a specified Facebook UID or not.
|
39
|
+
mattr_accessor :facebook_skip_create
|
40
|
+
@@facebook_skip_create = false
|
41
41
|
end
|
42
42
|
|
43
43
|
# Load core I18n locales: en
|
@@ -46,20 +46,15 @@ I18n.load_path.unshift File.expand_path(File.join(File.dirname(__FILE__), *%w[de
|
|
46
46
|
|
47
47
|
# Add +:facebook_connectable+ serializers and strategies to defaults.
|
48
48
|
#
|
49
|
-
Devise.
|
50
|
-
|
51
|
-
|
52
|
-
manager.default_serializers.unshift :facebook_connectable
|
53
|
-
end
|
54
|
-
end
|
49
|
+
Devise::STRATEGIES.unshift :facebook_connectable
|
50
|
+
Devise::SERIALIZERS.unshift :facebook_connectable
|
51
|
+
# Devise::CONTROLLERS.unshift :facebook_connectable # TODO: Wait for Devise 0.7.2 release.
|
55
52
|
|
56
53
|
# Override to get Devise to get that SessionsController should be used for both
|
57
54
|
# :facebook_connectable and :authenticatable. Controller-logic is the same.
|
58
55
|
#
|
59
56
|
Devise::Mapping.class_eval do
|
60
|
-
|
61
57
|
def allows?(controller)
|
62
58
|
(self.for & [Devise::CONTROLLERS[controller.to_sym], :facebook_connectable].flatten).present?
|
63
59
|
end
|
64
|
-
|
65
60
|
end
|
@@ -8,17 +8,25 @@ module Devise
|
|
8
8
|
|
9
9
|
def self.included(klass)
|
10
10
|
klass.class_eval do
|
11
|
+
before_filter :expired_session_hack
|
11
12
|
before_filter :set_facebook_session
|
12
|
-
helper_method :facebook_session # session[:facebook_session]
|
13
13
|
rescue_from ::Facebooker::Session::SessionExpired, :with => :facebook_session_expired
|
14
|
-
|
14
|
+
|
15
|
+
helper_method :facebook_session
|
16
|
+
|
17
|
+
# Required sprinkle of magic to avoid +Facebooker::Session::ExpiredSession+.
|
18
|
+
#
|
19
|
+
def expired_session_hack
|
20
|
+
clear_facebook_session_information
|
21
|
+
end
|
22
|
+
|
15
23
|
# Handle expired Facebook sessions automatically.
|
16
24
|
#
|
17
25
|
def facebook_session_expired
|
18
|
-
|
19
|
-
|
20
|
-
redirect_to root_url # TODO: Maybe a bad assumption? Maybe just re-load current page?
|
26
|
+
reset_session
|
27
|
+
redirect_to root_url
|
21
28
|
end
|
29
|
+
|
22
30
|
end
|
23
31
|
end
|
24
32
|
|
@@ -27,4 +35,4 @@ module Devise
|
|
27
35
|
end
|
28
36
|
end
|
29
37
|
|
30
|
-
ActionController::Base.send :include, Devise::FacebookConnectable::Controllers::Filters
|
38
|
+
ActionController::Base.send :include, Devise::FacebookConnectable::Controllers::Filters
|
@@ -5,6 +5,7 @@ require 'devise_facebook_connectable/serializer'
|
|
5
5
|
module Devise
|
6
6
|
module FacebookConnectable
|
7
7
|
module Model
|
8
|
+
|
8
9
|
# Facebook Connectable Module, responsible for validating authenticity of a
|
9
10
|
# user and storing credentials while signing in using their Facebook account.
|
10
11
|
#
|
@@ -27,27 +28,18 @@ module Devise
|
|
27
28
|
#
|
28
29
|
module FacebookConnectable
|
29
30
|
|
30
|
-
DEFAULT_FACEBOOK_UID_FIELD = :facebook_uid
|
31
|
-
DEFAULT_FACEBOOK_SESSION_KEY_FIELD = :facebook_session_key
|
32
|
-
|
33
31
|
def self.included(base)
|
34
32
|
base.class_eval do
|
35
33
|
extend ClassMethods
|
36
34
|
extend ::Devise::Models::SessionSerializer
|
37
|
-
|
38
|
-
cattr_accessor :facebook_uid_field, :facebook_session_key_field, :facebook_skip_create
|
39
35
|
end
|
40
36
|
end
|
41
37
|
|
42
38
|
# Store Facebook Connect account/session credentials.
|
43
39
|
#
|
44
40
|
def store_facebook_credentials!(attributes = {})
|
45
|
-
#
|
46
|
-
|
47
|
-
# self.send(:"#{self.class.facebook_session_key_field}=", attributes[:session_key])
|
48
|
-
|
49
|
-
self.send(:"#{DEFAULT_FACEBOOK_UID_FIELD}=", attributes[:uid])
|
50
|
-
self.send(:"#{DEFAULT_FACEBOOK_SESSION_KEY_FIELD}=", attributes[:session_key])
|
41
|
+
self.send(:"#{self.class.facebook_uid_field}=", attributes[:uid])
|
42
|
+
self.send(:"#{self.class.facebook_session_key_field}=", attributes[:session_key])
|
51
43
|
|
52
44
|
# Only populate +email+ field if it's available (say, if +authenticable+ module is used).
|
53
45
|
self.email = attributes[:email] || '' if self.respond_to?(:email)
|
@@ -106,14 +98,15 @@ module Devise
|
|
106
98
|
# For more info:
|
107
99
|
# http://facebooker.pjkh.com/user/populate
|
108
100
|
#
|
109
|
-
def
|
110
|
-
|
101
|
+
def on_before_facebook_connect(fb_session)
|
102
|
+
self.send(:before_facebook_connect, fb_session) rescue nil
|
111
103
|
end
|
112
|
-
alias :before_connect :before_facebook_connect
|
113
104
|
|
105
|
+
# Optional: Store session key.
|
106
|
+
#
|
114
107
|
def store_session(using_session_key)
|
115
108
|
if self.session_key != using_session_key
|
116
|
-
self.update_attribute(:
|
109
|
+
self.update_attribute(self.send(:"#{self.class.facebook_session_key_field}"), using_session_key)
|
117
110
|
end
|
118
111
|
end
|
119
112
|
|
@@ -121,7 +114,10 @@ module Devise
|
|
121
114
|
#
|
122
115
|
def new_facebook_session
|
123
116
|
returning(::Facebooker::Session.create) do |new_session|
|
124
|
-
new_session.secure_with!(self.
|
117
|
+
new_session.secure_with!(self.send(:"#{self.class.facebook_session_key_field}"),
|
118
|
+
self.send(:"#{self.class.facebook_uid_field}"),
|
119
|
+
1.hour.from_now
|
120
|
+
)
|
125
121
|
::Facebooker::Session.current = new_session
|
126
122
|
end
|
127
123
|
end
|
@@ -135,27 +131,28 @@ module Devise
|
|
135
131
|
|
136
132
|
module ClassMethods
|
137
133
|
|
134
|
+
# Configuration params accessible within +Devise.setup+ procedure (in initalizer).
|
135
|
+
#
|
136
|
+
# Example:
|
137
|
+
#
|
138
|
+
# Devise.setup do |config|
|
139
|
+
# config.facebook_uid_field = :facebook_uid
|
140
|
+
# config.facebook_session_key_field = :facebook_session_key
|
141
|
+
# config.facebook_skip_create = false
|
142
|
+
# end
|
143
|
+
#
|
144
|
+
::Devise::Models.config(self,
|
145
|
+
:facebook_uid_field,
|
146
|
+
:facebook_session_key_field,
|
147
|
+
:facebook_skip_create
|
148
|
+
)
|
149
|
+
|
138
150
|
# Alias don't work for some reason, so...a more Ruby-ish alias
|
139
151
|
# for +facebook_skip_create+.
|
140
|
-
#
|
141
152
|
def facebook_skip_create?
|
142
153
|
self.facebook_skip_create
|
143
154
|
end
|
144
155
|
|
145
|
-
# Specifies the name of the database column name used for storing
|
146
|
-
# the user Facebook UID.
|
147
|
-
#
|
148
|
-
def facebook_uid_field
|
149
|
-
@@facebook_uid_field ||= DEFAULT_FACEBOOK_UID_FIELD
|
150
|
-
end
|
151
|
-
|
152
|
-
# Specifies the name of the database column name used for storing
|
153
|
-
# the user Facebook session key.
|
154
|
-
#
|
155
|
-
def facebook_session_key_field
|
156
|
-
@@facebook_session_key_field ||= DEFAULT_FACEBOOK_SESSION_KEY_FIELD
|
157
|
-
end
|
158
|
-
|
159
156
|
# Authenticate using a Facebook UID.
|
160
157
|
#
|
161
158
|
def facebook_connect(attributes = {})
|
@@ -188,14 +185,6 @@ module Devise
|
|
188
185
|
true
|
189
186
|
end
|
190
187
|
|
191
|
-
# Configuration params accessible within +Devise.setup+ procedure (in initalizer).
|
192
|
-
#
|
193
|
-
::Devise::Models.config(self,
|
194
|
-
:facebook_uid_field,
|
195
|
-
:facebook_session_key_field,
|
196
|
-
:facebook_skip_create
|
197
|
-
)
|
198
|
-
|
199
188
|
end
|
200
189
|
|
201
190
|
end
|
@@ -6,10 +6,11 @@ module Devise
|
|
6
6
|
module Schema
|
7
7
|
|
8
8
|
# Creates facebook_uid and facebook_session_key (for Facebook Connect authentication/management).
|
9
|
+
#
|
9
10
|
def facebook_connectable
|
10
|
-
|
11
|
-
apply_schema ::Devise
|
12
|
-
apply_schema ::Devise
|
11
|
+
apply_schema ::Devise.facebook_uid_field, Integer, :limit => 8 # BIGINT unsigned / 64-bit int
|
12
|
+
# apply_schema ::Devise.facebook_uid_field, String
|
13
|
+
apply_schema ::Devise.facebook_session_key_field, String
|
13
14
|
end
|
14
15
|
|
15
16
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
require 'facebooker'
|
2
3
|
|
3
4
|
module Devise
|
4
5
|
module Strategies
|
@@ -13,7 +14,7 @@ module Devise
|
|
13
14
|
# Without a Facebook session authentication cannot proceed.
|
14
15
|
#
|
15
16
|
def valid?
|
16
|
-
|
17
|
+
::Facebooker::Session.current.present?
|
17
18
|
end
|
18
19
|
|
19
20
|
# Authenticate user with Facebook Connect.
|
@@ -21,8 +22,10 @@ module Devise
|
|
21
22
|
def authenticate!
|
22
23
|
klass = mapping.to
|
23
24
|
begin
|
24
|
-
facebook_session = session[:facebook_session]
|
25
|
-
|
25
|
+
facebook_session = ::Facebooker::Session.current # session[:facebook_session]
|
26
|
+
facebook_user = facebook_session.user
|
27
|
+
|
28
|
+
user = klass.facebook_connect(:uid => facebook_user.uid)
|
26
29
|
|
27
30
|
if user.present?
|
28
31
|
success!(user)
|
@@ -33,10 +36,9 @@ module Devise
|
|
33
36
|
user = returning(klass.new) do |u|
|
34
37
|
u.store_facebook_credentials!(
|
35
38
|
:session_key => facebook_session.session_key,
|
36
|
-
:uid =>
|
37
|
-
:email => facebook_session.user.proxied_email
|
39
|
+
:uid => facebook_user.uid
|
38
40
|
)
|
39
|
-
u.
|
41
|
+
u.on_before_facebook_connect(facebook_session)
|
40
42
|
end
|
41
43
|
|
42
44
|
begin
|
@@ -47,9 +49,9 @@ module Devise
|
|
47
49
|
end
|
48
50
|
end
|
49
51
|
end
|
50
|
-
#
|
51
|
-
#
|
52
|
-
|
52
|
+
# NOTE: Handled in the controller.
|
53
|
+
rescue # ::Facebooker::Session::SessionExpired
|
54
|
+
fail!(:facebook_invalid)
|
53
55
|
end
|
54
56
|
end
|
55
57
|
|