diff --git a/lib/authlogic_facebook_connect/session.rb b/lib/authlogic_facebook_connect/session.rb index 4d60f9c..e2199ff 100644 --- a/lib/authlogic_facebook_connect/session.rb +++ b/lib/authlogic_facebook_connect/session.rb @@ -11,13 +11,13 @@ module Config # Should the user be saved with our without validations? # # The default behavior is to save the user without validations and then - # in an application specific interface ask for the additional user + # in an application specific interface ask for the additional user # details to make the user valid as facebook just provides a facebook id. # - # This is useful if you do want to turn on user validations, maybe if you - # just have facebook connect as an additional authentication solution and + # This is useful if you do want to turn on user validations, maybe if you + # just have facebook connect as an additional authentication solution and # you already have valid users. - # + # # * Default: true # * Accepts: Boolean def facebook_valid_user(value = nil) @@ -38,6 +38,16 @@ def facebook_uid_field(value = nil) end alias_method :facebook_uid_field=, :facebook_uid_field + # What session key field should be used for the facebook session key + # + # + # * Default: :facebook_session_key + # * Accepts: Symbol + def facebook_session_key_field(value = nil) + rw_config(:facebook_session_key_field, value, :facebook_session_key) + end + alias_method :facebook_session_key_field=, :facebook_session_key_field + # Class representing facebook users we want to authenticate against # # * Default: klass @@ -75,24 +85,30 @@ def credentials=(value) def validate_by_facebook_connect facebook_session = controller.facebook_session - self.attempted_record = facebook_user_class.find(:first, :conditions => { facebook_uid_field => facebook_session.user.uid }).try(:"#{klass}".to_s.underscore) + self.attempted_record = facebook_user_class.find(:first, :conditions => { facebook_uid_field => facebook_session.user.uid }) + + if self.attempted_record + self.attempted_record.send(:"#{facebook_session_key_field}=", facebook_session.session_key) + self.attempted_record.save + end unless self.attempted_record || facebook_skip_new_user_creation begin # Get the user from facebook and create a local user. # # We assign it after the call to new in case the attribute is protected. - new_user = klass.new + if klass == facebook_user_class new_user.send(:"#{facebook_uid_field}=", facebook_session.user.uid) + new_user.send(:"#{facebook_session_key_field}=", facebook_session.session_key) else - new_user.send(:"build_#{facebook_user_class.to_s.underscore}", :"#{facebook_uid_field}" => facebook_session.user.uid) + new_user.send(:"build_#{facebook_user_class.to_s.underscore}", :"#{facebook_uid_field}" => facebook_session.user.uid, :"#{facebook_session_key_field}" => facebook_session.session_key) end new_user.before_connect(facebook_session) if new_user.respond_to?(:before_connect) - + self.attempted_record = new_user - + if facebook_valid_user errors.add_to_base( I18n.t('error_messages.facebook_user_creation_failed', @@ -104,7 +120,7 @@ def validate_by_facebook_connect self.attempted_record.save_with_validation(false) end rescue Facebooker::Session::SessionExpired - errors.add_to_base(I18n.t('error_messages.facebooker_session_expired', + errors.add_to_base(I18n.t('error_messages.facebooker_session_expired', :default => "Your Facebook Connect session has expired, please reconnect.")) end end @@ -116,21 +132,25 @@ def authenticating_with_facebook_connect? end private - def facebook_valid_user - self.class.facebook_valid_user - end - - def facebook_uid_field - self.class.facebook_uid_field - end + def facebook_valid_user + self.class.facebook_valid_user + end + + def facebook_uid_field + self.class.facebook_uid_field + end - def facebook_user_class - self.class.facebook_user_class - end + def facebook_session_key_field + self.class.facebook_session_key_field + end - def facebook_skip_new_user_creation - self.class.facebook_skip_new_user_creation - end + def facebook_user_class + self.class.facebook_user_class + end + + def facebook_skip_new_user_creation + self.class.facebook_skip_new_user_creation + end end end -end \ No newline at end of file +end