Skip to main content
 首页 » 编程设计

python之雅虎 OAuth API 拒绝我的访问 token 时间戳 (Python)

2025年05月04日11Free-Thinker

我正在开发一个来自 Yahoo! 的联系人导入器和 GMail 连接到我们正在使用 Python 和 DJango 开发的 Web 应用程序,我在使用 Yahoo! 时遇到了以下问题。

我可以请求我的授权 token 和我的 oauth 验证器,但是,当我将其交换为访问 token 以便我可以对 Yahoo 的 API 进行签名调用时,我得到以下响应:

'oauth_problem=timestamp_refused&oauth_acceptable_timestamps=1338401179-1338402379' 

并且,这是我生成的时间戳:

oauth_timestamp=1338401803 

如您所见,我的时间戳在他们要求的可接受的时间戳范围内。

这是我编写的生成 api 调用以获取我的访问 token 的函数:

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

它还在范围内。

我做错了什么? 我错过了什么吗?非常欢迎任何线索或建议,

提前致谢

请您参考如下方法:

我遇到了这个问题,我只在服务器上设置了我的时间戳就修复了它。 例如:我来自巴西,我的服务器是 EUA,我不得不在我的时间戳 = -7200 上减少 2 小时。 所以它工作得很好,我认为这是一个小错误,因为其他 API 没有相同的错误。