【问题标题】:OAuth 2.0 in php using curl使用 curl 的 php 中的 OAuth 2.0
【发布时间】:2014-08-21 10:24:34
【问题描述】:

我需要为 OAuth 2.0 获取我的 access_token 和 refresh_token 才能访问 Google API,下面的 php 脚本应该返回一个带有 access_token、refresh_token 的 json,如下所示:

{
  "access_token" : "####",
  "token_type" : "Bearer",
  "expires_in" : 3600,
  "refresh_token" : "####"
}

但是,php 脚本只返回这个错误信息:

{
"error" : "invalid_request",
"error_description" : "Client must specify either client_id or client_assertion, not both"
}

我尝试删除 client_secret/client_id 并仅使用 client_id/client_secret,但仍然收到相同的错误。

PHP 脚本

$client_id = '###.apps.googleusercontent.com';
$redirect_uri = 'http://localhost/phpConnectToDB/csv/refreshFusionTable.php';
$client_secret = '###';

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://accounts.google.com/o/oauth2/token");

$code = $_REQUEST['code'];

curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);


curl_setopt($ch, CURLOPT_POSTFIELDS, array(
'code' => $code,
'client_id' => $clientID,
'client_secret' => $clientSecret,
'redirect_uri' => $redirect_uri,
'grant_type' => 'authorization_code'
));

$data = curl_exec($ch);

var_dump($data);

虽然 cmd 中的 curl 可以正常工作并返回我访问和刷新令牌而没有任何错误。

curl --data "code=###&client_id=###.apps.googleusercontent.com&client_secret=###&redirect_uri=http://localhost/phpConnectToDB/csv/refreshFusionTable.php&grant_type=authorization_code" https://accounts.google.com/o/oauth2/token

我不明白为什么我会收到缺少方案的错误,尽管 .php 脚本存在并且它位于给定的路径上。你能帮我吗?

编辑

解决了“redirect_uri 的参数值无效:缺少方案”的问题,我刚刚在 CURLOPT_POSTFIELDS 中用这个 'redirect_uri' => $redirect_uri 替换了 'redirect_uri' => urlencode($redirect_uri)。

【问题讨论】:

    标签: php curl oauth-2.0 google-api http-post


    【解决方案1】:

    哇,愚蠢的错误,我应该休息一下。

    变量名称不匹配。 我定义了:

        $client_id = '###.apps.googleusercontent.com';
        $client_secret = '###';
    

    但这里我使用了一个不存在的 clientID 和 clientSecret :

        curl_setopt($ch, CURLOPT_POSTFIELDS, array(
        'code' => $code,
        'client_id' => $clientID,
        'client_secret' => $clientSecret,
        'redirect_uri' => $redirect_uri,
        'grant_type' => 'authorization_code'
        ));
    

    修复并运行 PHP 脚本

        $client_id = '###.apps.googleusercontent.com';
        $redirect_uri = 'http://localhost/phpConnectToDB/csv/refreshFusionTable.php';
        $client_secret = '###';
    
        $ch = curl_init();
        
        curl_setopt($ch, CURLOPT_URL, "https://accounts.google.com/o/oauth2/token");
        
        curl_setopt($ch, CURLOPT_POST, TRUE);
        
        $code = $_REQUEST['code'];
    
        // This option is set to TRUE so that the response
        // doesnot get printed and is stored directly in
        // the variable
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        
        curl_setopt($ch, CURLOPT_POSTFIELDS, array(
        'code' => $code,
        'client_id' => $client_id,
        'client_secret' => $client_secret,
        'redirect_uri' => $redirect_uri,
        'grant_type' => 'authorization_code'
        ));
    
        $data = curl_exec($ch);
        
        var_dump($data);
    

    但我不得不说,谷歌在这里提供了一些误导性的错误消息,因为我没有定义 client_id 和 client_secret 并且错误消息是:

        {
        "error" : "invalid_request",
        "error_description" : "Client must specify either client_id or client_assertion, not both"
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多