0

重複の可能性:
Yahoo Contacts API を使用して連絡先を取得する

ユーザーから Yahoo の連絡先を取得するシステムを開発しています。http://developer.yahoo.com/oauth/guide/oauth-auth-flow.htmlのすべての手順を完了し、アクセス トークンとトークン シークレットを取得しました。

HMAC-SHA1 アルゴリズムを使用して署名するのに問題があります。http://developer.yahoo.com/oauth/guide/oauth-signing.htmlの手順に従って署名キーを生成しましたが、特定のユーザーから連絡先を要求するとエラーが発生します:

<yahoo:error xmlns:yahoo='http://yahooapis.com/v1/base.rng'
    xml:lang='en-US'>
    <yahoo:description>Please provide valid credentials. OAuth oauth_problem="signature_invalid", realm="yahooapis.com"</yahoo:description>
</yahoo:error>

署名キーの生成を担当するコードは次のとおりです。

$s =  'oauth_consumer_key='.rawurlencode($yahoo_consumer_key).'&';
$s .= 'oauth_nonce='.rawurlencode(uniqid()).'&';
$s .= 'oauth_signature_method='.rawurlencode('HMAC-SHA1').'&';
$s .= 'oauth_timestamp='.rawurlencode(time()).'&';
$s .= 'oauth_token='.rawurlencode($ouathToken).'&';
$s .= 'oauth_version='.rawurlencode('1.0').'&';
$s .= 'realm='.rawurlencode('yahooapis.com');

$baseString ='GET&'.rawurlencode('http://social.yahooapis.com/v1/user/'.$guid.'/contacts').'&'.rawurlencode($s);

$signingKey = rawurlencode($yahoo_consumer_secret).'&'.rawurlencode($ouathTokenSecret);

$signature = urlencode(base64_encode(hash_hmac('sha1', $baseString, $signingKey, true)));

curl_setopt_array($ch, array(
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_FOLLOWLOCATION => TRUE,
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_SSL_VERIFYHOST => 0,
            CURLOPT_HTTPGET => true,
            CURLOPT_POST       => false,
            CURLOPT_URL => 'http://social.yahooapis.com/v1/user/'.$guid.'/contacts'.    
                                  '?realm=yahooapis.com'.
                                  '&oauth_consumer_key='.$yahoo_consumer_key.
                                  '&oauth_nonce='.uniqid().
                                  '&oauth_signature_method=HMAC-SHA1'.
                                  '&oauth_timestamp='.time().
                                  '&oauth_token='.$ouathToken.
                                  '&oauth_version=1.0'.
                                  '&oauth_signature='.$signature
        ));

$result = curl_exec($ch);

間違いがどこにあるのか教えてくれる人はいますか?署名鍵を正しく生成していませんか?

ありがとうございました。

4

1 に答える 1

0

スペースに「%20」の代わりに「+」のようなものを使用するrawurlencodeの代わりに、いくつかの場所でurlencodeを使用しているようです。Yahooのドキュメント(この分野にはあまり適していません)には、urlencodeの代わりにrawurlencodeを使用した「正規化された」ヘッダー/URL文字列が示されています。リクエストをエンコードする方法以外は、見栄えがします。

*編集:rawurlencodeとurlencodeを混同していました。Rawurlencodeは、OAuthで必要とされるRFC 3986を使用します:http://oauth.net/core/1.0/#encoding_parameters

$ sもダブルエンコーディングしています!これを行わないでください-$sを作成するときは、rawurlencodeをまったく使用せず、$baseStringまたはURLを作成するときにエンコードします。$sを作成するときに上部にエンコードしますが、2回目に$でエンコードしないでください。 baseString。

于 2013-01-10T16:44:09.430 に答える