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
- 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