2010-02-17 29 views
35

Tôi đang cố gắng để Oauth làm việc với API Google bằng cách sử dụng Python. Tôi đã thử các thư viện oauth khác nhau như oauth, oauth2djanog-oauth nhưng tôi không thể làm cho nó hoạt động (bao gồm các ví dụ được cung cấp).Oauth cho ví dụ về Google API sử dụng Python/Django

Đối gỡ lỗi Oauth tôi sử dụng Google Oauth Playground và tôi đã nghiên cứu các APIOauth documentation

Với một số thư viện Tôi đang phải vật lộn với nhận được một chữ ký phải, với các thư viện khác mà tôi đang phải vật lộn với việc chuyển đổi các thẻ yêu cầu một ủy quyền mã thông báo. Điều gì thực sự sẽ giúp tôi nếu ai đó có thể hiển thị cho tôi ví dụ làm việc cho API Google bằng một trong các thư viện nêu trên.

EDIT: Câu hỏi đầu tiên của tôi không dẫn đến bất kỳ câu trả lời nào vì vậy tôi đã thêm mã của mình. Có hai nguyên nhân có thể khiến mã này không hoạt động:
1) Google không ủy quyền mã thông báo yêu cầu của tôi, nhưng không hoàn toàn chắc chắn cách phát hiện này
2) Chữ ký cho mã thông báo truy cập không hợp lệ nhưng sau đó tôi muốn biết thông số oauth mà Google mong đợi khi tôi có thể tạo chữ ký thích hợp trong giai đoạn đầu tiên.

Điều này được viết bằng oauth2.py và cho Django do đó, HttpResponseRedirect.

REQUEST_TOKEN_URL = 'https://www.google.com/accounts/OAuthGetRequestToken' 
AUTHORIZATION_URL = 'https://www.google.com/accounts/OAuthAuthorizeToken' 
ACCESS_TOKEN_URL = 'https://www.google.com/accounts/OAuthGetAccessToken' 

CALLBACK = 'http://localhost:8000/mappr/mappr/oauth/' #will become real server when deployed 

OAUTH_CONSUMER_KEY = 'anonymous' 
OAUTH_CONSUMER_SECRET = 'anonymous' 

signature_method = oauth.SignatureMethod_HMAC_SHA1() 
consumer = oauth.Consumer(key=OAUTH_CONSUMER_KEY, secret=OAUTH_CONSUMER_SECRET) 
client = oauth.Client(consumer) 

request_token = oauth.Token('','') #hackish way to be able to access the token in different functions, I know this is bad, but I just want it to get working in the first place :) 

def authorize(request): 
    if request.GET == {}: 
     tokens = OAuthGetRequestToken() 
     return HttpResponseRedirect(AUTHORIZATION_URL + '?' + tokens) 
    elif request.GET['oauth_verifier'] != '': 
     oauth_token = request.GET['oauth_token'] 
     oauth_verifier = request.GET['oauth_verifier'] 
     OAuthAuthorizeToken(oauth_token) 
     OAuthGetAccessToken(oauth_token, oauth_verifier) 
     #I need to add a Django return object but I am still debugging other phases. 

def OAuthGetRequestToken(): 
    print '*** OUTPUT OAuthGetRequestToken ***' 
    params = { 
    'oauth_consumer_key': OAUTH_CONSUMER_KEY, 
    'oauth_nonce': oauth.generate_nonce(), 
    'oauth_signature_method': 'HMAC-SHA1', 
    'oauth_timestamp': int(time.time()), #The timestamp should be expressed in number of seconds after January 1, 1970 00:00:00 GMT. 
    'scope': 'https://www.google.com/analytics/feeds/', 
    'oauth_callback': CALLBACK, 
    'oauth_version': '1.0' 
    } 

    # Sign the request. 
    req = oauth.Request(method="GET", url=REQUEST_TOKEN_URL, parameters=params) 
    req.sign_request(signature_method, consumer, None) 

    tokens =client.request(req.to_url())[1] 
    params = ConvertURLParamstoDictionary(tokens) 
    request_token.key = params['oauth_token'] 
    request_token.secret = params['oauth_token_secret'] 
    return tokens 

def OAuthAuthorizeToken(oauth_token): 
    print '*** OUTPUT OAuthAuthorizeToken ***' 
    params ={ 
    'oauth_token' :oauth_token, 
    'hd': 'default' 
    } 
    req = oauth.Request(method="GET", url=AUTHORIZATION_URL, parameters=params) 
    req.sign_request(signature_method, consumer, request_token) 
    response =client.request(req.to_url()) 
    print response #for debugging purposes 

def OAuthGetAccessToken(oauth_token, oauth_verifier): 
    print '*** OUTPUT OAuthGetAccessToken ***' 
    params = { 
    'oauth_consumer_key': OAUTH_CONSUMER_KEY, 
    'oauth_token': oauth_token, 
    'oauth_verifier': oauth_verifier, 
    'oauth_token_secret': request_token.secret, 
    'oauth_signature_method': 'HMAC-SHA1', 
    'oauth_timestamp': int(time.time()), 
    'oauth_nonce': oauth.generate_nonce(), 
    'oauth_version': '1.0',  
    } 

    req = oauth.Request(method="GET", url=ACCESS_TOKEN_URL, parameters=params) 
    req.sign_request(signature_method, consumer, request_token) 

    response =client.request(req.to_url()) 
    print response 
    return req 

def ConvertURLParamstoDictionary(tokens): 
    params = {} 
    tokens = tokens.split('&') 
    for token in tokens: 
     token = token.split('=') 
     params[token[0]] = token[1] 

    return params 

Trả lời

2

Đây có thể là câu trả lời.

Khi gọi OAuthGetRequestToken bạn ký vào base_string với consumer_secret của bạn trước khi & (và)

Khi gọi OAuthGetAccessToken bạn ký vào base_string với consumer_secret của bạn trước khi & (và) tiếp theo token_secret.

Bạn sẽ ký base_string sử dụng (consumer_secret + "& ") cho OAuthGetRequestToken và bạn sẽ ký base_string sử dụng (consumer_secret +" &" + token_secret) cho OAuthGetAccessToken

http://hueniverse.com/2008/10/beginners-guide-to-oauth-part-iii-security-architecture/ trong plaintext và Các phương thức HMAC-SHA1, bí mật được chia sẻ là sự kết hợp giữa Bí mật người tiêu dùng và Mật khẩu mã thông báo.

+0

Cảm ơn !!! Điều này tiết kiệm ngày của tôi !!! – VHanded

0

IIRC Google OAuth là không hoàn toàn theo tiêu chuẩn, bạn có để xác định dịch vụ mà bạn đang yêu cầu cho (xem các ví dụ được cung cấp trong tài liệu google) trong yêu cầu như một tham số bổ sung, hoặc nó sẽ không hoạt động.

2

Tornado có mã hoạt động cho Google oauth. Kiểm tra nó ra ở đây. google auth. Tôi đã sử dụng nó và làm việc khá tốt ra khỏi hộp. Tất cả bạn cần làm là nhổ ra lớp và cẩn thận đặt nó vào một cái nhìn django.

PS: Tornado sử dụng mô-đun không đồng bộ để người dùng quay lại. Vì bạn đang sử dụng django bạn cần phải dựa vào một số nhận được biến để xác định rằng một người dùng đã chỉ cấp quyền truy cập vào ứng dụng của bạn.

+0

ví dụ này chỉ sử dụng Mã phụ trợ API của Google+ hoặc đó là hỗn hợp hoặc cả Khách hàng và Chương trình phụ trợ? –

4

này làm việc cho tôi.

def login(request): 
    consumer_key = 'blabla' 
    consumer_secret = 'blabla' 
    callback = request.GET['callback'] 
    request_token_url = 'https://api.linkedin.com/uas/oauth/requestToken' 
    authorize_url =  'https://api.linkedin.com/uas/oauth/authorize' 
    access_token_url = 'https://api.linkedin.com/uas/oauth/accessToken' 
    consumer = oauth.Consumer(consumer_key, consumer_secret) 

    if ('oauth_verifier' not in request.GET): 
     client = oauth.Client(consumer) 
     body = 'oauth_callback=http://shofin.com/login?callback='+callback+"&placeId="+request.GET[placeId] 
     resp,content = client.request(request_token_url,"POST",headers={'Content-Type':'application/x-www-form-urlencoded'},body=body) 
     request_token = dict(urlparse.parse_qsl(content)) 
     loginUrl = authorize_url+"?oauth_token="+request_token['oauth_token'] 
     cache.set(request_token['oauth_token'],request_token['oauth_token_secret']) 
     return HttpResponseRedirect(loginUrl) 

    elif request.GET['oauth_verifier']: 
     token = oauth.Token(request.GET['oauth_token'],cache.get(request.GET['oauth_token'])) 
     token.set_verifier(request.GET['oauth_verifier']) 
     client = oauth.Client(consumer, token) 
     resp,content = client.request(access_token_url,"POST",{}) 
     access_token = dict(urlparse.parse_qsl(content)) 
     token = oauth.Token(key=access_token['oauth_token'], secret=access_token['oauth_token_secret']) 

     client = oauth.Client(consumer, token) 
     resp,json = client.request("http://api.linkedin.com/v1/people/~?format=json") 
     return render_to_response(callback,{'placeId':request.GET['placeId'],'userId':userId,'folkId':folkId) 
Các vấn đề liên quan