Module: AuthlogicOpenid::ActsAsAuthentic::Methods

Defined in:
lib/authlogic_openid/acts_as_authentic.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(klass) ⇒ Object

Set up some simple validations



20
21
22
23
24
25
# File 'lib/authlogic_openid/acts_as_authentic.rb', line 20

def self.included(klass)
  klass.class_eval do
    validates_uniqueness_of :openid_identifier, :scope => validations_scope, :if => :using_openid?
    validate :validate_openid
  end
end

Instance Method Details

#openid_identifier=(value) ⇒ Object

Set the openid_identifier field and also resets the persistence_token if this value changes.



28
29
30
31
32
33
# File 'lib/authlogic_openid/acts_as_authentic.rb', line 28

def openid_identifier=(value)
  write_attribute(:openid_identifier, value.blank? ? nil : OpenIdAuthentication.normalize_identifier(value))
  reset_persistence_token if openid_identifier_changed?
rescue OpenIdAuthentication::InvalidOpenId => e
  @openid_error = e.message
end

#save(perform_validation = true, &block) ⇒ Object

This is where all of the magic happens. This is where we hook in and add all of the OpenID sweetness.

I had to take this approach because when authenticating with OpenID nonces and what not are stored in database tables. That being said, the whole save process for ActiveRecord is wrapped in a transaction. Trying to authenticate with OpenID in a transaction is not good because that transaction be get rolled back, thus reversing all of the OpenID inserts and making OpenID authentication fail every time. So We need to step outside of the transaction and do our OpenID madness.

Another advantage of taking this approach is that we can set fields from their OpenID profile before we save the record, if their OpenID provider supports it.



45
46
47
48
49
50
51
52
53
# File 'lib/authlogic_openid/acts_as_authentic.rb', line 45

def save(perform_validation = true, &block)
  if !perform_validation || !authenticate_with_openid? || (authenticate_with_openid? && authenticate_with_openid)
    result = super
    yield(result) if block_given?
    result
  else
    false
  end
end