Created
April 20, 2013 04:25
-
-
Save kimhyunkang/5424742 to your computer and use it in GitHub Desktop.
Google OAuth demo
This file contains 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
#!/usr/bin/python | |
'demo Google OAuth' | |
import sys, os, urllib, urllib2, time, httplib | |
import hmac, hashlib, random, re, base64 | |
PARAMETERS = { | |
'oauth_consumer_key': os.getenv('OAUTH_CONSUMER_KEY') or 'anonymous', | |
'oauth_signature_method': 'HMAC-SHA1', | |
'oauth_signature': '', | |
'oauth_timestamp': os.getenv('OAUTH_TIMESTAMP') or '%d' % time.time(), | |
'oauth_nonce': os.getenv('OAUTH_NONCE') or '%x' % random.getrandbits(64), | |
'oauth_version': '1.0', | |
'oauth_callback': os.getenv('OAUTH_CALLBACK') or 'callback', | |
} | |
SCOPE = {'scope': 'https://www.google.com/calendar/feeds/'} | |
SECRET = os.getenv('OAUTH_CONSUMER_SECRET') or 'anonymous' | |
def google_oauth(): | |
'OAuthGetRequestToken, OAuthAuthorizeToken, OAuthGetAccessToken' | |
request_token = get_request_token() | |
return request_token | |
def get_request_token(): | |
'ask Google for a request token' | |
url = 'https://www.google.com/accounts/OAuthGetRequestToken' | |
token_secret = '' # we don't have a token secret yet | |
PARAMETERS['oauth_signature'] = sign('&'.join((SECRET, token_secret)), | |
'&'.join(map(urlencode, ('GET', url, parameters('signing'))))) | |
body = urllib.urlencode(SCOPE) | |
request = urllib2.Request(url + '?' + body) | |
request.add_header('Authorization', 'OAuth ' + parameters('header')) | |
opener = urllib2.build_opener(urllib2.HTTPSHandler(debuglevel = 1)) | |
request = opener.open(request) | |
reply = request.read() | |
request.close() | |
return reply | |
def byte_encode(match): | |
'for use with re.sub' | |
return '%%%02X' % ord(match.group()) | |
def urlencode(string): | |
"unreserved = ALPHA, DIGIT, '-', '.', '_', '~'" | |
return re.sub(re.compile('[^0-9A-Za-z._~-]'), | |
byte_encode, string.encode('utf8')) | |
def sign(secret, text): | |
print >>sys.stderr, 'signature base string: "%s", secret: %s' % ( | |
repr(text), repr(secret)) | |
digest = hmac.new(secret, text, hashlib.sha1).digest() | |
return urlencode(base64.encodestring(digest).rstrip()) | |
def base64string(hexstring): | |
recoded = urlencode(base64.encodestring(hexstring.decode('hex')).rstrip()) | |
print >>sys.stderr, 'recoded:', recoded | |
return recoded | |
def parameters(format): | |
if format == 'header': | |
formatted = ', '.join(['%s="%s"' % (key, value) | |
for key, value in PARAMETERS.items()]) | |
return formatted | |
elif format == 'signing': | |
formatted = '&'.join(sorted(['%s=%s' % (key, | |
urlencode(value.encode('utf8'))) for | |
key, value in (PARAMETERS.items() + SCOPE.items()) if | |
key not in ['oauth_signature']])) | |
#print >>sys.stderr, format, formatted | |
return formatted | |
def hmac_sha1_test(): | |
'from tools.ietf.org/html/rfc2202' | |
assert sign('\x0b' * 20, 'Hi There') == base64string( | |
'b617318655057264e28bc0b6fb378c8ef146be00') | |
assert sign('Jefe', 'what do ya want for nothing?') == base64string( | |
'effcdf6ae5eb2fa2d27416d5f184df9c259a7c79') | |
assert sign('\xaa' * 20, '\xdd' * 50) == base64string( | |
'125d7342b9ac11cd91a39af48aa17b4f63f175d3') | |
# last test from http://oauth.net/core/1.0/#rfc.section.9.1.1, app. A.5.2 | |
assert sign('kd94hf93k423kf44&pfkkdhi9sl3r4s00', | |
'GET&http%3A%2F%2Fphotos.example.net%2Fphotos&file%3Dvacation.jpg%26' + \ | |
'oauth_consumer_key%3Ddpf43f3p2l4k3l03%26oauth_nonce%3D' + \ | |
'kllo9940pd9333jh%26oauth_signature_method%3DHMAC-SHA1%26' + \ | |
'oauth_timestamp%3D1191242096%26oauth_token%3Dnnch734d00sl2jdk%26' + \ | |
'oauth_version%3D1.0%26size%3Doriginal') == urlencode( | |
'tR3+Ty81lMeYAr/Fid0kMTYa/WM=') | |
return True | |
if __name__ == '__main__': | |
command = os.path.splitext(os.path.basename(sys.argv[0]))[0] | |
print eval(command)(*sys.argv[1:]) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment