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
- module FacebookConnectable
26
-
27
- extend self
28
-
29
- mattr_accessor :verbose
30
-
31
- # Logging helper: Internal debug-logging for the plugin.
32
- #
33
- def log(message, level = :info)
34
- return unless @@verbose
35
- level = :info if level.blank?
36
- @@logger ||= ::Logger.new(::STDOUT)
37
- @@logger.send(level.to_sym, "[devise/facebook_connectable:] #{level.to_s.upcase} #{message}")
38
- end
39
-
40
- end
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.setup do |config|
50
- config.warden do |manager|
51
- manager.default_strategies.unshift :facebook_connectable
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
- clear_fb_cookies!
19
- clear_facebook_session_information
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
- # FIXME: Don't work...nil for some reason.
46
- # self.send(:"#{self.class.facebook_uid_field}=", attributes[:uid])
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 before_facebook_connect(facebook_session)
110
- # Default: Do nothing.
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(:facebook_session_key, using_session_key)
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.facebook_session_key, self.facebook_uid, 1.hour.from_now)
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
- # apply_schema ::Devise::Models::FacebookConnectable.facebook_uid_field, Integer, :limit => 8 # BIGINT unsigned / 64-bit int
11
- apply_schema ::Devise::Models::FacebookConnectable.facebook_uid_field, String
12
- apply_schema ::Devise::Models::FacebookConnectable.facebook_session_key_field, String
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
- session[:facebook_session].present?
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
- user = klass.facebook_connect(:uid => facebook_session.user.uid)
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 => facebook_session.user.uid,
37
- :email => facebook_session.user.proxied_email
39
+ :uid => facebook_user.uid
38
40
  )
39
- u.before_connect(facebook_session)
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
- # Now handled in the controller.
51
- # rescue ::Facebooker::Session::SessionExpired
52
- # fail!(:facebook_session_expired)
52
+ # NOTE: Handled in the controller.
53
+ rescue # ::Facebooker::Session::SessionExpired
54
+ fail!(:facebook_invalid)
53
55
  end
54
56
  end
55
57
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: devise_facebook_connectable
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonas Grimfelt