【问题标题】:How to reproduce OAuth1.0 Request Headers in PHP CURL如何在 PHP CURL 中重现 OAuth1.0 请求标头
【发布时间】:2021-02-24 14:33:36
【问题描述】:

我正在尝试使用 PHP 7.4 在网络服务器上发出 Twitter verify_credentials 请求。

只有当我像这样在 Postman 中设置 OAuth1.0 请求标头设置时,我才会收到 http 200 代码和正确响应:

使用相同数据发出请求的任何其他方式都会向我返回一个带有 401 http 状态代码的错误

{"errors":[{"code":32,"message":"Could not authenticate you."}

我需要在 GUZZLE 的 PHP CURL 或其他 http 请求客户端代码中转换此 Postman 设置。但是当我从 Postman 导入 CURL 示例时,它总是抛出相同的 401 异常。所以我尝试了不同的方法:

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://api.twitter.com/1.1/account/verify_credentials.json",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "GET",
  CURLOPT_HTTPHEADER => array(
    "Authorization: OAuth oauth_consumer_key=\"oauth_consumer_key\",oauth_token=\"oauth_token\",oauth_signature_method=\"HMAC-SHA1\",oauth_timestamp=\"1605187800\",oauth_nonce=\"hmkiezWh6xqlfJYpK55rDVgcGydQkuBH\",oauth_version=\"1.0\",oauth_callback=\"http%3A%2F%2Fmyurl.com\",oauth_signature=\"signature\""
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;

或者另一个:

        use GuzzleHttp\Client;
        use GuzzleHttp\Psr7\Request;

        $client = new Client;
        $headers =[
            'Authorization' => 'OAuth oauth_consumer_key="oauth_consumer_key",oauth_token="oauth_token",oauth_signature_method="HMAC-SHA1",oauth_timestamp="1605187800",oauth_nonce="hmkiezWh6xqlfJYpK55rDVgcGydQkuBH",oauth_version="1.0",oauth_callback="http%3A%2F%2Furl.com",oauth_signature="SdB60Nr6AhJzOdAIWlW%2FwdmeJM4%3D"',
        ];
        $request = new Request('GET', 'https://api.twitter.com/1.1/account/verify_credentials.json', $headers);
        $client->send($request);
        $response = $client->getResponse();
        echo $response->getBody();

或者那样:

// Generated by curl-to-PHP: http://incarnate.github.io/curl-to-php/
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, 'https://api.twitter.com/1.1/account/verify_credentials.json');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');


$headers = array();
$headers[] = 'Authorization: OAuth oauth_consumer_key=\"oauth_consumer_key\",oauth_token=\"oauth_token\",oauth_signature_method=\"HMAC-SHA1\",oauth_timestamp=\"1605187800\",oauth_nonce=\"hmkiezWh6xqlfJYpK55rDVgcGydQkuBH\",oauth_version=\"1.0\",oauth_callback=\"http%3A%2F%2Furl.com\",oauth_signature=\"H%2FpmcdPUnlMD8RN42RpfBs%2Fs7Cc%3D\"';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$result = curl_exec($ch);
if (curl_errno($ch)) {
    echo 'Error:' . curl_error($ch);
}
curl_close($ch);

每次都会收到 401 错误。那么,如何在 PHP CURL 中设置所有 OAuth1.0 属性,以在 Postman 中使用相同的标头重现相同的请求?

附:我已经尝试过 abraham/twitteroauth、laravel/socialite 和其他解决方案,结果相同

【问题讨论】:

  • 以下答案对您有用吗?

标签: php oauth twitter-oauth guzzle php-curl


【解决方案1】:

原因不在 CURL 选项中,而是在无效签名中,因为据我所知,它取决于时间戳。所以我不能使用不同时间戳的签名

【讨论】:

    【解决方案2】:

    如果你使用的是guzzle 6或以上版本,那么你可以直接使用guzzle自己创建的guzzlehttp/oauth-subscriber包来处理(否则是一个漫长的过程),

    将以下内容添加到您的 composer.json:

    {
        "require": {
            "guzzlehttp/oauth-subscriber": "0.4.*"
        }
    }
    

    我从他们的文档中获取了示例,

    use GuzzleHttp\Client;
    use GuzzleHttp\HandlerStack;
    use GuzzleHttp\Subscriber\Oauth\Oauth1;
    
    $stack = HandlerStack::create();
    
    $middleware = new Oauth1([
        'consumer_key'    => 'my_key',
        'consumer_secret' => 'my_secret',
        'token'           => 'my_token',
        'token_secret'    => 'my_token_secret'
    ]);
    $stack->push($middleware);
    
    $client = new Client([
        'base_uri' => 'https://api.twitter.com/1.1/',
        'handler' => $stack
    ]);
    
    // Set the "auth" request option to "oauth" to sign using oauth
    $res = $client->get('account/verify_credentials.json', ['auth' => 'oauth']);
    

    您可以关注guzzle/oauth-subscriberdocs(https://github.com/guzzle/oauth-subscriber)了解更多信息。

    【讨论】:

    • 谢谢。它可以工作,但解决方案是另一回事。我会添加一个答案
    • 这行不通了。
    猜你喜欢
    • 2016-12-31
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2013-08-24
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 2016-03-24
    相关资源
    最近更新 更多