Skip to content

Instantly share code, notes, and snippets.

@collin
Created April 15, 2009 11:13
Show Gist options
  • Select an option

  • Save collin/95723 to your computer and use it in GitHub Desktop.

Select an option

Save collin/95723 to your computer and use it in GitHub Desktop.
class UserSession < Authlogic::Session::Base
def self.twitter_consumer
@twitter_consumer ||= OAuth::Consumer.new(
TwitterOAuthConsumerKey,
TwitterOAuthSecretKey,
:site => "http://twitter.com"
)
end
def authorize_via_twitter
controller.redirect_to request_token.authorize_url
end
def request_token
@request_token ||= load_request_token || create_request_token
end
def create_request_token
token = self.class.twitter_consumer.get_request_token
dump_request_token token
token
end
def dump_request_token token
self.raw_request_token = token.to_yaml
end
def load_request_token
return nil unless raw_request_token
YAML.load raw_request_token
end
def raw_request_token
controller.session[:twitter_request_token]
end
def raw_request_token= token
controller.session[:twitter_request_token] = token
end
def oauth_tokens_match?
controller.params[:oauth_token] == request_token.token
end
def connecting_through_twitter?
@connecting_through_twitter ||= !!raw_request_token
end
def connected_through_twitter?
@connected_through_twitter ||= !!twitter_credentials
end
def twitter_credentials
controller.session[:twitter_credentials] ||= JSON.parse(access_token.get('/account/verify_credentials.json').read_body)
end
def access_token
@access_token ||= request_token.get_access_token
end
def purge_request_token!
@access_token = nil
@request_token = nil
@connecting_through_twitter = nil
@connected_through_twitter = nil
self.raw_request_token = nil
end
def twitter_auth_error!
errors.add_to_base("
We have had an honest misunderstanding with Twitter.
The Web is a big place, sometimes we get confused and lost along the way.
Please try connecting through Twitter again.")
end
def save
if connecting_through_twitter?
unless oauth_tokens_match? && connected_through_twitter?
twitter_auth_error!
yield false
return
end
record = klass.for_twitter_credentials(twitter_credentials)
if !record
purge_request_token!
twitter_auth_error!
yield false
return
end
self.unauthorized_record = record
result = super
save_cookie
return result
else
super
end
rescue OAuth::Unauthorized
purge_request_token!
twitter_auth_error!
yield false
return
end
def authentication_method
connected_through_twitter? ? 'twitter' : 'password'
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment