私はTwitterの署名ドキュメントの作成に取り組んでいます。
署名ベース文字列の例と署名キーの例を使用して、ドキュメントで推奨されているように、hash_hmac関数に渡しました。
$sig_base_str = 'POST&https%3A%2F%2Fapi.twitter.com%2F1%2Fstatuses%2Fupdate.json&include_entities%3Dtrue%26oauth_consumer_key%3Dxvz1evFS4wEEPTGEFPHBog%26oauth_nonce%3DkYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1318622958%26oauth_token%3D370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb%26oauth_version%3D1.0%26status%3DHello%2520Ladies%2520%252B%2520Gentlemen%252C%2520a%2520signed%2520OAuth%2520request%2521';
$sig_key = 'kAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw&LswwdoUaIvS8ltyTt5jkRh4J50vUPVVHtR2YPi5kE';
$sha = hash_hmac('sha1', $sig_base_str, $sig_key);
$sha = strtoupper($sha);
$output = str_split($sha,2);
$output = implode(' ',$output);
echo $output;
これにより、例とまったく同じバイナリが得られますB6 79 C0 AF 18 F4 E9 C5 87 AB 8E 20 0A CD 4E 48 A9 3F 8C B6
。
今、ドキュメントはそれをbase64に変換するように言っています。PHPのbase64_encode()
関数を使用できると思います。
$sha = hash_hmac('sha1', $sig_base_str, $sig_key);
echo base64_encode($sha);
しかし、これにより、OAuth_signatureの値が正しくなくなります。
YjY3OWMwYWYxOGY0ZTljNTg3YWI4ZTIwMGFjZDRlNDhhOTNmOGNiNg==
http://ideone.com/Bu0CZiを表示して、動作中の関数を確認してください。
私は何が間違っているのですか?関数の前に大文字に変換してスペースを含めることも試みたことに注意してくださいbase64_encode()
。Twitter APIの使用に問題があります。これは、ドキュメントの例でも、署名を正しく取得できないためだと思います。