view oauth_experiment.py @ 0:7b42ce648fe5

origination
author Atul Varma <avarma@mozilla.com>
date Sat, 12 Jun 2010 17:06:05 -0700
parents
children 379d5d9a5f34
line wrap: on
line source

import os
import json
import urlparse
import urllib
import oauth2 as oauth

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'

config = json.loads(open("config.json").read())

consumer = oauth.Consumer(config['consumer_key'],
                          config['consumer_secret'])

def app(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' % (
            request_token_url,
            urllib.urlencode({'oauth_callback': 'http://localhost:8000/callback'})
            )
        print "url is %s" % url
        client = oauth.Client(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))

        open('request-token.json', 'w').write(json.dumps(request_token))

        print "Request Token:"
        print "    - oauth_token        = %s" % request_token['oauth_token']
        print "    - oauth_token_secret = %s" % request_token['oauth_token_secret']
        print 

        # Step 2: Redirect to the provider. Since this is a CLI script we do not 
        # redirect. In a web application you would redirect the user to the URL
        # below.

        redirect_url = "%s?oauth_token=%s" % (authorize_url,
                                              request_token['oauth_token'])
        start_response('302 Found',
                       [('Location', redirect_url)])
        return []
    elif path == '/callback':
        qsdict = dict(urlparse.parse_qsl(qs))

        # TODO: Ensure request_token['oauth_token'] 
        # is the same as the one in qsdict['oauth_token'].

        request_token = json.loads(open('request-token.json').read())
        token = oauth.Token(request_token['oauth_token'],
                            request_token['oauth_token_secret'])
        token.set_verifier(qsdict['oauth_verifier'])
        client = oauth.Client(consumer, token)
        resp, content = client.request(access_token_url, "POST")
        access_token = dict(urlparse.parse_qsl(content))
        print "Access Token:"
        print "    - oauth_token        = %s" % access_token['oauth_token']
        print "    - oauth_token_secret = %s" % access_token['oauth_token_secret']
        print "    - user_id            = %s" % access_token['user_id']
        print "    - screen_name        = %s" % access_token['screen_name']
        print
        print "You may now access protected resources using the access tokens above." 
        print
        start_response('200 OK',
                       [('Content-Type', 'text/plain')])
        return [json.dumps(access_token, indent=2)]

    start_response('404 Not Found',
                   [('Content-Type', 'text/plain')])
    return ['path not found: %s' % path]