devise_facebook_connectable 0.1.1 → 0.1.2
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.
@@ -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
|
|