Created
April 15, 2009 11:13
-
-
Save collin/95723 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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