/
session.rb
64 lines (56 loc) · 2.08 KB
/
session.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
module AuthlogicFacebookConnect
module Session
def self.included(klass)
klass.class_eval do
extend Config
include Methods
end
end
module Config
# What user field should be used for the facebook UID?
#
# This is useful if you want to use a single field for multiple types of
# alternate user IDs, e.g. one that handles both OpenID identifiers and
# facebook ids.
#
# * <tt>Default:</tt> :facebook_uid
# * <tt>Accepts:</tt> Symbol
def facebook_uid_field(value = nil)
config(:facebook_uid_field, value, :facebook_uid)
end
alias_method :facebook_uid_field=, :facebook_uid_field
end
module Methods
def self.included(klass)
klass.class_eval do
validate :validate_by_facebook_connect, :if => :authenticating_with_facebook_connect?
end
def credentials=(value)
# TODO: Is there a nicer way to tell Authlogic that we don't have any credentials than this?
values = [:facebook_connect]
super
end
end
def validate_by_facebook_connect
facebook_session = controller.facebook_session
self.attempted_record =
klass.find(:first, :conditions => { facebook_uid_field => facebook_session.user.uid })
unless self.attempted_record
begin
# Get the user from facebook and create a local user
self.attempted_record = klass.new(
facebook_uid_field => facebook_session.user.uid)
# Save the user without validation as we may have validations for the user that are not met yet
self.attempted_record.save(false)
rescue Facebooker::Session::SessionExpired
errors.add_to_base(I18n.t('error_messages.facebooker_session_expired',
:default => "Your Facebook Connect session has expired, please reconnect."))
end
end
end
def authenticating_with_facebook_connect?
attempted_record.nil? && errors.empty? && controller.facebook_session
end
end
end
end