0

「Twitter でサインイン」を実装しようとしました
が、このトピックで多くの質問が表示されます。多くの質問を読んで、
次のリンクを使用しました。

Sign in with Twitter
POST oauth/request_tokenの実装
署名
の作成 リクエストの承認

結果は
response です: oauth 署名とトークンの検証に失敗しました(最も頻繁にエラーになる可能性があります =))

私がやったこと:

date_default_timezone_set('UTC');
$oauth_consumer_key = 'mYOauThConsuMerKey'; //from app settings

function generate_nonce() {
    $mt = microtime();
    $rand = mt_rand();
    return md5($mt . $rand); // md5s look nicer than numbers
}
$oauth_nonce = generate_nonce();
    $http_method = 'POST';
    $base_url = 'https://api.twitter.com/oauth/request_token';
    $oauth_signature_method = 'HMAC-SHA1';
    $oauth_timestamp = time();
    $oauth_token = 'mytokenFromAPPsettoings';
    $oauth_version = '1.0';
$oauth_callback = 'http://twoends.home/backend';
    $params = array(
        rawurlencode('oauth_nonce')=>rawurlencode($oauth_nonce),
        rawurlencode('oauth_callback')=>rawurlencode($oauth_callback),
        rawurlencode('oauth_signature_method')=>rawurlencode($oauth_signature_method),
        rawurlencode('oauth_timestamp')=>rawurlencode($oauth_timestamp),
        rawurlencode('oauth_token')=>rawurlencode($oauth_token),
        rawurlencode('oauth_version')=>rawurlencode($oauth_version),
    );

    ksort($params);
    $parameter_string = http_build_query($params,'','&');
        $base_string  = strtoupper($http_method).'&';
        $base_string .= rawurlencode($base_url).'&';
        $base_string .= rawurlencode($parameter_string);

        $oauth_consumer_secret = 'myappconsumersecret';
        $oauth_token_secret = 'mytokensecret';
$oauth_signing_key =rawurlencode($oauth_consumer_secret).'&'.rawurlencode($oauth_token_secret);
$oauth_signature = base64_encode(hash_hmac('sha1', $base_string, $oauth_signing_key, true));
$DST ='OAuth ';
foreach($params as $key=>$value){
    $DST .= $key.'='.'"'.$value.'"&';
}
$DST = rtrim($DST,'&');

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $base_url);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: '.$DST));
curl_setopt($ch, CURLINFO_HEADER_OUT, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);

そのため、このコードは非常に苦労し
ましたが、この段階ではトークンが必要ないことを読んだあるトピックでエラーが発生します。それがあってもなくても-何も問題ありません-同じエラー
が時間で再生しようとしました(UTCを設定)-同じエラーまた、誰かの作業コードをこの
ように使用しようとしましたが、うまくいきませんでした。 なぜ私は誰かのライブラリを使用していないのですか?助けが必要

事前にt​​hx、助けをいただければ幸いです。ステップバイステップガイドの作業例を入手できますか?

4

3 に答える 3

1

あなたのコードにはいくつか問題があるようです:

1) params 配列には、oauth_token の代わりに oauth_consumer_key を含める必要があります

$params = array(
    rawurlencode('oauth_nonce')=>rawurlencode($oauth_nonce),
    rawurlencode('oauth_callback')=>rawurlencode($oauth_callback),
    rawurlencode('oauth_signature_method')=>rawurlencode($oauth_signature_method),
    rawurlencode('oauth_timestamp')=>rawurlencode($oauth_timestamp),
    rawurlencode('oauth_consumer_key')=>rawurlencode($oauth_consumer_key),
    rawurlencode('oauth_version')=>rawurlencode($oauth_version),
);

2) リクエスト トークンの署名キーは、oauth_consumer_secret の後にアンパサンドを使用して作成する必要があります。

$oauth_signing_key =rawurlencode($oauth_consumer_secret).'&';

3) Authorization ヘッダーのどこにも署名を設定していないようです。行う:

$DST ='OAuth ';
foreach($params as $key=>$value){
    $DST .= $key.'='.'"'.$value.'"&';
}
$DST .= 'oauth_signature='.rawurlencode($oauth_signature)
于 2013-10-15T09:33:28.070 に答える
0


@Jonny S のおかげで、問題を見直して新しいデータを投稿したいと思います。いくつかの間違いを見つけて、別のエラーが発生しました =)

したがって、私のワークフローは次のようになります。

nonce を生成する関数、追加情報: apiの oauth_nonce 、 oauth.net

function generate_nonce() {
    $mt = microtime();
    $rand = mt_rand();

    return md5($mt . $rand); // md5s look nicer than numbers
}

Twitter でのサインインの実装(このリンクは、事前に POST する必要があるヘッダーを示しています) と、移動する方向を示しています - POST oauth/request_token
このページは、oauth docs セクション 6.1
にリンクしています。トークンを要求するために必要なパラメーターを見つけることができますが、公式ドキュメントでは、Twitter API の必須パラメーターである「oauth_calback」パラメーターが見つかりません。

私が行う次のステップ - 必要なパラメーターの収集:

  • oauth_consumer_key

    $oauth_consumer_key = 'YoUrS KEy FrOm aPP ApI';
    
  • oauth_nonce

    $oauth_nonce = generate_nonce();
    
  • oauth_callback

    $oauth_callback = 'http://twoends.home/backend';
    
  • oauth_sinature_method

    $oauth_signature_method = 'HMAC-SHA1';
    
  • oauth_timestamp

    $oauth_timestamp = time();
    
  • oauth_version

    $oauth_version = '1.0';
    
  • 追加のパラメーター (プロセスで必要):

  • OAuth 署名 (最もトリッキーな部分)

ここに、署名の作成方法に関する API ページがあります。

最初に、必要なすべてのパラメーターをまとめて収集し、それらをパーセントエンコードして並べ替える必要があります。それらを配列にプッシュしました。

    $params = array(
        rawurlencode('oauth_consumer_key')=>rawurlencode($oauth_consumer_key),
        rawurlencode('oauth_nonce')=>rawurlencode($oauth_nonce),
        rawurlencode('oauth_callback')=>rawurlencode($oauth_callback),
        rawurlencode('oauth_signature_method')=>rawurlencode($oauth_signature_method),
        rawurlencode('oauth_timestamp')=>rawurlencode($oauth_timestamp),
        rawurlencode('oauth_version')=>rawurlencode($oauth_version),
    );

次に並べ替えます。

    ksort($params);

次に、パラメーター文字列を作成しています:

    $parameter_string = http_build_query($params,'','&');

結果:

パラメータ文字列:oauth_callback=http%253A%252F%252Ftwoends.home%252Fbackend&oauth_consumer_key=oauth_consumer_key_wQjQ7u5lgwA&oauth_nonce=46fa649c21ac5315d4d4510ff68ad630&oauth_signature_method=HMAC-SHA1&oauth_timestamp=18091809バージョン=1

次に、hash_hmac() 関数のデータ パラメータとして署名を作成するために使用される base_string を作成する必要があります。

    $base_string = strtoupper($http_method).'&';
    $base_string .= rawurlencode($base_url).'&';
    $base_string .= rawurlencode($parameter_string);

結果:

POST&https%3A%2F%2Fapi.twitter.com%2Foauth%2Frequest_token&oauth_callback%3Dhttp%25253A%25252F%25252Ftwoends.home%25252Fbackend%26oauth_consumer_key%3Dapp_cons_keyQjQ7u5lgwA%26oauth_nonce%3D46fa649c21ac5315d4d4510ff68ad630%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1381930918%26oauth_version%3D1. 0

次に、APP 設定から consumer_secret を取得して、hash_hmac() 関数の 3 番目のパラメーターとして署名を作成するために使用される署名キーを作成します。

    $oauth_consumer_secret = 'consumer_secret_from_app_settings';
    $oauth_signing_key = rawurlencode($oauth_consumer_secret).'&';

言及することの1つ:最初のステップで(request_tokenトークンを入れる必要はありません)

このステップは署名を作成します:

    $oauth_signature = base64_encode(hash_hmac('sha1', $base_string, $oauth_signing_key, true));

次に、署名を params 配列に追加し、ヘッダー文字列を構築する必要があります

    $params['oauth_signature'] = rawurlencode($oauth_signature);
    ksort($params);

ヘッダー文字列の構築は、ヘッダー文字列の構築にあります。

    $DST ='OAuth ';
    foreach($params as $key=>$value){
        $DST .= $key.'='.'"'.$value.'", ';
    }
    $DST = rtrim($DST,', ');

    //or we can make it by hand as below

    //$DST .= 'oauth_nonce="'.rawurlencode($oauth_nonce)
    //     .'", oauth_callback="'.rawurlencode($oauth_callback)
    //     .'", oauth_signature_method="HMAC-SHA1", oauth_timestamp="'
    //     .rawurlencode($oauth_timestamp).'", oauth_consumer_key="'
    //     .rawurlencode($oauth_consumer_key).'", oauth_signature="'
    //     .rawurlencode($oauth_signature).'", oauth_version="1.0"';

最後のステップ (希望) は、リクエストを送信することです。

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $base_url);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: '.$DST));
    curl_setopt($ch, CURLINFO_HEADER_OUT, 1);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    $response = curl_exec($ch);
    $info = curl_getinfo($ch);
    curl_close($ch);

    echo '<pre>';
        print_r($info);
    echo '</pre>';

このコードはエラー 400 を生成します -
curl_setopt($ch, CURLOPT_POST, true); を削除すると、リクエストが正しくありません。エラーが発生します - 401
リクエスト情報ダンプ:

Array
(
    [url] => https://api.twitter.com/oauth/request_token
    [content_type] => 
    [http_code] => 400
    [header_size] => 66
    [request_size] => 471
    [filetime] => -1
    [ssl_verify_result] => 0
    [redirect_count] => 0
    [total_time] => 0.710993
    [namelookup_time] => 0.081279
    [connect_time] => 0.23482
    [pretransfer_time] => 0.550913
    [size_upload] => 0
    [size_download] => 0
    [speed_download] => 0
    [speed_upload] => 0
    [download_content_length] => 0
    [upload_content_length] => -1
    [starttransfer_time] => 0.710976
    [redirect_time] => 0
    [redirect_url] => 
    [primary_ip] => 199.16.156.104
    [certinfo] => Array
    (
    )

    [primary_port] => 443
    [local_ip] => 192.168.1.234
    [local_port] => 54994
    [request_header] => POST /oauth/request_token HTTP/1.1
Host: api.twitter.com
Accept: */*
Authorization: OAuth oauth_callback="http%3A%2F%2Ftwoends.home%2Fbackend", oauth_consumer_key="your_consumer_keyCwQjQ7u5lgwA", oauth_nonce="1ba83f0af239f439c1524096c33faefe", oauth_signature="QZZvrJ8wzCQOYhiKJeT4vz%2FWCcg%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1381931941", oauth_version="1.0"
Content-Length: -1
Content-Type: application/x-www-form-urlencoded
Expect: 100-continue


)

これがエラーの場所を理解するのに役立つことを願っています。事前に、Fiddler を使用してリクエストをトレースしてみます。

------------------------------------------------------
新APIで解決

于 2013-10-16T14:06:34.800 に答える
0

oauth_callback URL がベースストリングでトリプル エンコードされているようです。次の形式にする必要があります。

POST&https%3A%2F%2Fapi.twitter.com%2Foauth%2Frequest_token&
oauth_callback%3Dhttp%253A%252F%252Ftwoends.home%252Fbackend%26
oauth_consumer_key%3Dapp_cons_keyQjQ7u5lgwA ...

あなたのベースストリングで:

oauth_callback%3Dhttp%25253A%25252F%25252Ftwoends.home%25252Fbackend

犯人は「http_build_query」のようです。

于 2013-10-17T08:12:25.960 に答える