Mercurial > universal-identity-relyer
view twitter_client.py @ 10:1686a3266557
minor refactoring
author | Atul Varma <avarma@mozilla.com> |
---|---|
date | Sat, 12 Jun 2010 20:10:54 -0700 |
parents | 42fe50c20cc8 |
children | 727b82d4b596 |
line wrap: on
line source
import json import urlparse import urllib from wsgiref.util import application_uri class TwitterOauthClientApp(object): base_url = 'https://api.twitter.com/oauth/' request_token_url = base_url + 'request_token' access_token_url = base_url + 'access_token' authorize_url = base_url + 'authorize' def __init__(self, consumer, oauth, request_tokens, onsuccess): self.oauth = oauth self.consumer = consumer self.onsuccess = onsuccess 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. oauth_callback = '%scallback' % application_uri(environ) url = '%s?%s' % ( self.request_token_url, urllib.urlencode({'oauth_callback': 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.onsuccess(environ, start_response) start_response('404 Not Found', [('Content-Type', 'text/plain')]) return ['path not found: %s' % path]