使用Python / Django的Google API示例中的Oauth

6 浏览
0 Comments

使用Python / Django的Google API示例中的Oauth

我正在尝试使用Python使Google API与Oauth配合工作。我尝试了不同的oauth库,如oauth、oauth2和djanog-oauth,但无法使其工作(包括提供的示例)。

为了调试Oauth,我使用了Google的Oauth Playground,并研究了API和Oauth文档。

对于某些库,我在获取正确签名方面遇到了困难;对于其他库,我在将请求令牌转换为授权令牌方面遇到了困难。如果有人能够向我展示使用上述库之一的Google API的工作示例,那将非常有帮助。

编辑:我的初始问题没有得到任何答案,所以我添加了我的代码。这段代码不起作用有两个可能的原因:

1)Google不授权我的请求令牌,但我不太确定如何检测这一点

2)访问令牌的签名无效,但我想知道Google期望哪些oauth参数,因为我能够在第一阶段生成正确的签名。

这是使用oauth2.py编写的,用于Django,因此使用了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/' #部署时将变为真实服务器
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方法,我知道这样做不好,但我只是想先让它工作 :)
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)
        #我需要添加一个Django返回对象,但我仍在调试其他阶段。
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()), #时间戳应表示自1970年1月1日00:00:00 GMT以来的秒数。
    'scope': 'https://www.google.com/analytics/feeds/',
    'oauth_callback': CALLBACK,
    'oauth_version': '1.0'
    }
    #签署请求。
    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 #用于调试目的
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

0