2009-07-31 26 views
11

Ich bin ziemlich neu in der Programmierung für das Web. und ich möchte hier bei Null anfangen. Ich habe versucht, das Netz zu suchen, aber endete völlig verwirrt. Jetzt möchte ich lernen, wie man ein Google-Konto über ein Python-Skript authentifiziert. kann mir bitte jemand ein Code-Fragment oder ein beliebiges Beispiel liefern.oauth google mit Python

Vielen Dank im Voraus.

+0

Ich habe auf die gleiche Sache den ganzen Tag arbeiten, hoffen, bald etwas zu haben, zu arbeiten. –

Antwort

0

Einige gute Links oben (der Spielplatz ist von unschätzbarem Wert).

Ich verwende eine Mischung aus Leah Culvers oAuth Code (das Beispiel in b3rx's Beitrag) und FireEagle's Python OAuth code. Ersteres, das letzte Mal, als ich nachgesehen hatte, fehlte an Umfangsmethoden.

Stellen Sie außerdem sicher, dass Sie auf klar sind, ob Sie 2 or 3 legged OAuth verwenden: auf Codierung dieser

19

Ich verbrachte einen ganzen Tag, nach mehreren gescheiterten Versuchen in den letzten paar Wochen. Dies bringt Sie nur bis zum ersten Schritt, aber ohne externe Bibliotheken. Und ja, ich weiß, es ist fast zwei Jahre nach dem OP, aber nach allem, was ich sehen konnte, musste es noch getan werden.


#!/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)) 
response = opener.open(request) 
reply = response.read() 
response.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()]) 
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:]) 

speichern es als google_oauth.py, und Sie können wie so verknüpfen:

ln -s google_oauth.py hmac_sha1_test.py
eine der Subroutinen zu testen. In Kombination mit der Verwendung von Umgebungsvariablen können Sie Ihre Ergebnisse mit denen von OAuth Playground von Google vergleichen (andere Personen geben hier den Link an) und sehen, wo Sie falsch liegen. Ich habe auf diese Weise viele Probleme mit dem Skript gefunden. vielleicht gibt es noch viel mehr. Aber wenn Sie rufen ./google_oauth.py, sollten Sie etwas sehen:

 
[email protected]:~/rentacoder/marchie$ ./google_oauth.py 
signature base string: "'GET&https%3A%2F%2Fwww.google.com%2Faccounts%2FOAuthGetRequestToken&oauth_callback%3Dcallback%26oauth_consumer_key%3Danonymous%26oauth_nonce%3Da64720fda018906b%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1302253695%26oauth_version%3D1.0%26scope%3Dhttps%253A%252F%252Fwww.google.com%252Fcalendar%252Ffeeds%252F'", secret: 'anonymous&' 
send: 'GET /accounts/OAuthGetRequestToken?scope=https%3A%2F%2Fwww.google.com%2Fcalendar%2Ffeeds%2F HTTP/1.1\r\nAccept-Encoding: identity\r\nHost: www.google.com\r\nConnection: close\r\nAuthorization: OAuth oauth_nonce="a64720fda018906b", oauth_timestamp="1302253695", oauth_consumer_key="anonymous", oauth_signature_method="HMAC-SHA1", oauth_version="1.0", oauth_signature="LSJxopFXWN71sTSIBIkNeGgsOjc%3D", oauth_callback="callback"\r\nUser-Agent: Python-urllib/2.6\r\n\r\n' 
reply: 'HTTP/1.1 200 OK\r\n' 
header: Content-Type: text/plain; charset=UTF-8 
header: Date: Fri, 08 Apr 2011 09:08:20 GMT 
header: Expires: Fri, 08 Apr 2011 09:08:20 GMT 
header: Cache-Control: private, max-age=0 
header: X-Content-Type-Options: nosniff 
header: X-XSS-Protection: 1; mode=block 
header: Content-Length: 118 
header: Server: GSE 
header: Connection: close 
oauth_token=4%2FfvSIWW9WBHXa_CjInpOf4FdNYhCj&oauth_token_secret=qhB1EGIKjL1pG9POF2ZOcQk3&oauth_callback_confirmed=true 
+0

Dieser Code verdient mehr ups! – Eduardo

+0

gracias, compa! –

+1

Schöner Inhalt zu bauen. Um es ein wenig zu reinigen, denke ich, dass die Zuweisung in 'request = opener.open (request)' 'response = opener.open (request)' lauten sollte und die Antwort sollte die Anfrage in den nachfolgenden 2 Zeilen –