158 lines
5.7 KiB
Python
158 lines
5.7 KiB
Python
'''
|
|
Example consumer.
|
|
'''
|
|
import httplib
|
|
import time
|
|
import oauth.oauth as oauth
|
|
import webbrowser
|
|
from scapi import util
|
|
|
|
SERVER = 'sandbox-soundcloud.com' # Change to soundcloud.com to reach the live site
|
|
PORT = 80
|
|
|
|
REQUEST_TOKEN_URL = 'http://api.' + SERVER + '/oauth/request_token'
|
|
ACCESS_TOKEN_URL = 'http://api.' + SERVER + '/oauth/access_token'
|
|
AUTHORIZATION_URL = 'http://' + SERVER + '/oauth/authorize'
|
|
|
|
CALLBACK_URL = ''
|
|
RESOURCE_URL = "http://api." + SERVER + "/me"
|
|
|
|
# key and secret granted by the service provider for this consumer application - same as the MockOAuthDataStore
|
|
CONSUMER_KEY = 'JysXkO8ErA4EluFnF5nWg'
|
|
CONSUMER_SECRET = 'fauVjm61niGckeufkmMvgUo77oWzRHdMmeylJblHk'
|
|
|
|
# example client using httplib with headers
|
|
class SimpleOAuthClient(oauth.OAuthClient):
|
|
|
|
def __init__(self, server, port=httplib.HTTP_PORT, request_token_url='', access_token_url='', authorization_url=''):
|
|
self.server = server
|
|
self.port = port
|
|
self.request_token_url = request_token_url
|
|
self.access_token_url = access_token_url
|
|
self.authorization_url = authorization_url
|
|
self.connection = httplib.HTTPConnection("%s:%d" % (self.server, self.port))
|
|
|
|
def fetch_request_token(self, oauth_request):
|
|
# via headers
|
|
# -> OAuthToken
|
|
print oauth_request.to_url()
|
|
#self.connection.request(oauth_request.http_method, self.request_token_url, headers=oauth_request.to_header())
|
|
self.connection.request(oauth_request.http_method, oauth_request.to_url())
|
|
response = self.connection.getresponse()
|
|
print "response status", response.status
|
|
return oauth.OAuthToken.from_string(response.read())
|
|
|
|
def fetch_access_token(self, oauth_request):
|
|
# via headers
|
|
# -> OAuthToken
|
|
|
|
# This should proably be elsewhere but stays here for now
|
|
oauth_request.set_parameter("oauth_signature", util.escape(oauth_request.get_parameter("oauth_signature")))
|
|
self.connection.request(oauth_request.http_method, self.access_token_url, headers=oauth_request.to_header())
|
|
response = self.connection.getresponse()
|
|
resp = response.read()
|
|
print "*" * 90
|
|
print "response:", resp
|
|
print "*" * 90
|
|
|
|
return oauth.OAuthToken.from_string(resp)
|
|
|
|
def authorize_token(self, oauth_request):
|
|
webbrowser.open(oauth_request.to_url())
|
|
raw_input("press return when authorizing is finished")
|
|
|
|
return
|
|
|
|
# via url
|
|
# -> typically just some okay response
|
|
self.connection.request(oauth_request.http_method, oauth_request.to_url())
|
|
response = self.connection.getresponse()
|
|
return response.read()
|
|
|
|
def access_resource(self, oauth_request):
|
|
print "resource url:", oauth_request.to_url()
|
|
webbrowser.open(oauth_request.to_url())
|
|
|
|
return
|
|
|
|
# via post body
|
|
# -> some protected resources
|
|
self.connection.request('GET', oauth_request.to_url())
|
|
response = self.connection.getresponse()
|
|
return response.read()
|
|
|
|
def run_example():
|
|
|
|
# setup
|
|
print '** OAuth Python Library Example **'
|
|
client = SimpleOAuthClient(SERVER, PORT, REQUEST_TOKEN_URL, ACCESS_TOKEN_URL, AUTHORIZATION_URL)
|
|
consumer = oauth.OAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET)
|
|
signature_method_plaintext = oauth.OAuthSignatureMethod_PLAINTEXT()
|
|
signature_method_hmac_sha1 = oauth.OAuthSignatureMethod_HMAC_SHA1()
|
|
pause()
|
|
# get request token
|
|
print '* Obtain a request token ...'
|
|
pause()
|
|
oauth_request = oauth.OAuthRequest.from_consumer_and_token(consumer, http_url=client.request_token_url)
|
|
#oauth_request.sign_request(signature_method_plaintext, consumer, None)
|
|
oauth_request.sign_request(signature_method_hmac_sha1, consumer, None)
|
|
|
|
print 'REQUEST (via headers)'
|
|
print 'parameters: %s' % str(oauth_request.parameters)
|
|
pause()
|
|
#import pdb; pdb.set_trace()
|
|
|
|
token = client.fetch_request_token(oauth_request)
|
|
print 'GOT'
|
|
print 'key: %s' % str(token.key)
|
|
print 'secret: %s' % str(token.secret)
|
|
pause()
|
|
|
|
print '* Authorize the request token ...'
|
|
pause()
|
|
oauth_request = oauth.OAuthRequest.from_token_and_callback(token=token, callback=CALLBACK_URL, http_url=client.authorization_url)
|
|
print 'REQUEST (via url query string)'
|
|
print 'parameters: %s' % str(oauth_request.parameters)
|
|
pause()
|
|
# this will actually occur only on some callback
|
|
response = client.authorize_token(oauth_request)
|
|
print 'GOT'
|
|
print response
|
|
pause()
|
|
|
|
# get access token
|
|
print '* Obtain an access token ...'
|
|
pause()
|
|
oauth_request = oauth.OAuthRequest.from_consumer_and_token(consumer, token=token, http_url=client.access_token_url)
|
|
oauth_request.sign_request(signature_method_hmac_sha1, consumer, token)
|
|
print 'REQUEST (via headers)'
|
|
print 'parameters: %s' % str(oauth_request.parameters)
|
|
pause()
|
|
token = client.fetch_access_token(oauth_request)
|
|
print 'GOT'
|
|
print 'key: %s' % str(token.key)
|
|
print 'secret: %s' % str(token.secret)
|
|
pause()
|
|
|
|
# access some protected resources
|
|
print '* Access protected resources ...'
|
|
pause()
|
|
parameters = {}
|
|
oauth_request = oauth.OAuthRequest.from_consumer_and_token(consumer, token=token, http_method='GET', http_url=RESOURCE_URL, parameters=parameters)
|
|
oauth_request.sign_request(signature_method_hmac_sha1, consumer, token)
|
|
print 'REQUEST (via get body)'
|
|
print 'parameters: %s' % str(oauth_request.parameters)
|
|
pause()
|
|
params = client.access_resource(oauth_request)
|
|
print 'GOT'
|
|
print 'non-oauth parameters: %s' % params
|
|
pause()
|
|
|
|
def pause():
|
|
print ''
|
|
time.sleep(1)
|
|
|
|
if __name__ == '__main__':
|
|
run_example()
|
|
print 'Done.'
|