我正在从 Yahoo! 开发联系人导入器!和 GMail 到我们正在做的网络应用程序,使用 Python 和 DJango,我正面临 Yahoo! 的以下问题。
我可以请求我的授权令牌和我的 oauth 验证程序,但是,当我将其交换为访问令牌以便可以对 Yahoo 的 API 进行签名调用时,我得到以下响应:
'oauth_problem=timestamp_refused&oauth_acceptable_timestamps=1338401179-1338402379'
而且,这是我生成的时间戳:
oauth_timestamp=1338401803
如您所见,我的时间戳在您所要求的可接受的时间戳范围内。
这是我编写的生成 api 调用以获取我的访问令牌的函数:
def _yahoo_access_url(request, token, verifier):
plain_url = settings.YAHOO_GET_ACCESS_URL
signature = '&'.join((settings.YAHOO_SECRET + '%26', request.session['oauth_data']['oauth_token_secret']))
nonce_charset = string.ascii_lowercase + string.ascii_uppercase + string.digits
nonce = ''.join(random.sample(nonce_charset, 6))
parameters = {
'oauth_consumer_key': settings.YAHOO_KEY,
'oauth_signature_method': 'PLAINTEXT',
'oauth_version': '1.0',
'oauth_verifier': verifier,
'oauth_token': token,
'oauth_timestamp': int(time.time()),
'oauth_nonce': nonce,
'oauth_signature': signature,
}
return settings.YAHOO_GET_ACCESS_URL % urllib.urlencode(parameters)
然后,我正在做一些研究来解决我的问题,在 LinkedIn 开发者论坛上,我发现有人和我有同样的问题,他们给他的答案是他的服务器时间错误并且它产生了错误的时间戳,我发现了一个雅虎!Web服务来获取时间戳,所以,我这样修改了我的函数:
def _yahoo_access_url(request, token, verifier):
plain_url = settings.YAHOO_GET_ACCESS_URL
signature = '&'.join((settings.YAHOO_SECRET + '%26', request.session['oauth_data']['oauth_token_secret']))
nonce_charset = string.ascii_lowercase + string.ascii_uppercase + string.digits
nonce = ''.join(random.sample(nonce_charset, 6))
timestamp = eval(urllib2.urlopen(settings.YAHOO_GET_TIME_URL, 'GET').read())
parameters = {
'oauth_consumer_key': settings.YAHOO_KEY,
'oauth_signature_method': 'PLAINTEXT',
'oauth_version': '1.0',
'oauth_verifier': verifier,
'oauth_token': token,
'oauth_timestamp': timestamp['Result']['Timestamp'],
'oauth_nonce': nonce,
'oauth_signature': signature,
}
return settings.YAHOO_GET_ACCESS_URL % urllib.urlencode(parameters)
这样,我直接从 Yahoo! 的服务器获得时间戳,但我仍然遇到同样的问题:
响应:'oauth_problem=timestamp_refused&oauth_acceptable_timestamps=1338401958-1338403158'
时间戳:oauth_timestamp=1338402557
它仍在范围内。
我究竟做错了什么?我错过了什么吗?,非常欢迎任何线索或建议,
先感谢您