2

Yahoo!から連絡先インポーターを開発しています。PythonとDJangoを使用して実行しているWebアプリにGMailを送信すると、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開発者フォーラムで、私が持っていたのと同じ問題を抱えている誰かを見つけました、彼らが彼に与えた答えは彼のサーバー時間が間違っていてそれが悪いタイムスタンプを生成していたということでした、私はYahoo! タイムスタンプを取得する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

それはまだ範囲内です。

私は何が間違っているのですか?私は何かが足りないのですか?、手がかりやアドバイスは大歓迎です、

前もって感謝します

4

1 に答える 1

1

この問題が発生し、サーバーでタイムスタンプを設定するだけで修正しました。例:私はブラジル出身で、サーバーはEUAです。タイムスタンプ=-7200で2時間を短縮する必要がありました。他のAPIにも同じエラーがないため、これは小さなバグだと思います。

于 2013-02-20T19:39:03.137 に答える