Mercurial > universal-identity-relyer
view twitter_client.py @ 7:c6aef586ab82
added success_delegate
author | Atul Varma <avarma@mozilla.com> |
---|---|
date | Sat, 12 Jun 2010 19:47:49 -0700 |
parents | f0273e301ee4 |
children | 51dfea268026 |
line wrap: on
line source
import json import urlparse import urllib class TwitterOauthClientApp(object): request_token_url = 'https://api.twitter.com/oauth/request_token' access_token_url = 'https://api.twitter.com/oauth/access_token' authorize_url = 'https://api.twitter.com/oauth/authorize' def __init__(self, consumer, oauth, oauth_callback, request_tokens, success_delegate): self.oauth_callback = oauth_callback self.oauth = oauth self.consumer = consumer self.success_delegate = success_delegate self.request_tokens = request_tokens def __call__(self, environ, start_response): path = environ['PATH_INFO'] qs = environ['QUERY_STRING'] if path == '/request': # Step 1: Get a request token. This is a temporary token that is used for # having the user authorize an access token and to sign the request to obtain # said access token. url = '%s?%s' % ( self.request_token_url, urllib.urlencode({'oauth_callback': self.oauth_callback}) ) client = self.oauth.Client(self.consumer) resp, content = client.request(url, "GET") if resp['status'] != '200': raise Exception("Invalid response %s." % resp['status']) request_token = dict(urlparse.parse_qsl(content)) if ('oauth_callback_confirmed' not in request_token or request_token['oauth_callback_confirmed'] != 'true'): raise Exception("Oauth callback must be confirmed.") self.request_tokens[request_token['oauth_token']] = request_token # Step 2: Redirect to the provider. redirect_url = "%s?oauth_token=%s" % (self.authorize_url, request_token['oauth_token']) start_response('302 Found', [('Location', redirect_url)]) return [] elif path == '/callback': qsdict = dict(urlparse.parse_qsl(qs)) if qsdict['oauth_token'] not in self.request_tokens: raise Exception('invalid token: %s' % self.request_tokens) request_token = self.request_tokens[qsdict['oauth_token']] del self.request_tokens[qsdict['oauth_token']] token = self.oauth.Token(request_token['oauth_token'], request_token['oauth_token_secret']) token.set_verifier(qsdict['oauth_verifier']) client = self.oauth.Client(self.consumer, token) resp, content = client.request(self.access_token_url, "POST") if resp['status'] != '200': raise Exception("Invalid response %s." % resp['status']) access_token = dict(urlparse.parse_qsl(content)) environ['oauth.access_token'] = access_token return self.success_delegate(environ, start_response) start_response('404 Not Found', [('Content-Type', 'text/plain')]) return ['path not found: %s' % path]