module AuthlogicOauth # This module is responsible for adding oauth # to the Authlogic::Session::Base class. module Session def self.included(klass) klass.class_eval do extend Config include Methods end end module Config # * Default: :find_by_oauth_token # * Accepts: Symbol def find_by_oauth_method(value = nil) rw_config(:find_by_oauth_method, value, :find_by_oauth_token) end alias_method :find_by_oauth_method=, :find_by_oauth_method end module Methods include OauthProcess def self.included(klass) klass.class_eval do validate :validate_by_oauth, :if => :authenticating_with_oauth? end end # Hooks into credentials so that you can pass a user who has already has an oauth access token. def credentials=(value) super values = value.is_a?(Array) ? value : [value] hash = values.first.is_a?(Hash) ? values.first.with_indifferent_access : nil self.record = hash[:priority_record] if !hash.nil? && hash.key?(:priority_record) end def record=(record) @record = record end # Clears out the block if we are authenticating with oauth, # so that we can redirect without a DoubleRender error. def save(&block) block = nil if redirecting_to_oauth_server? super(&block) end private def authenticating_with_oauth? !controller.params[:login_with_oauth].blank? || oauth_response end def authenticate_with_oauth if @record self.attempted_record = record else self.attempted_record = search_for_record(find_by_oauth_method, generate_access_token.token) #errors.add_to_base("Unable to authenticate with Twitter.") end if !attempted_record errors.add_to_base("Could not find user in our database, have you registered with your oauth account?") end end def find_by_oauth_method self.class.find_by_oauth_method end end end end