为什么卷发无法验证谷歌访问令牌而浏览器成功?

时间:2017-12-22 11:27:03

标签: google-oauth php-curl

通过这个简单的代码,我设法获得Google的访问权限。 见代码:

public function authenticate($code = null) {
  if (!$code) {
     if ($this->log)
        error_log(__CLASS__ . '::authenticate() error: $code is null.');
     return false;
  }
  $client_id = $this->token->get('client_id');
  $client_secret  = $this->token->get('client_secret');
  $redirect_uri = $this->token->get('redirect_uri');
  $url = $this->token->get('token_endpoint');
  $curlPost = 'client_id=' . $client_id . '&client_secret=' . $client_secret . '&redirect_uri=' . $redirect_uri . '&code='. $code . '&grant_type=authorization_code';
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_POST, 1);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
  curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);
  $buffer = curl_exec($ch);
  $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
  curl_close($ch);
  $data = \json_decode($buffer, true);
  if ($http_code != 200) {
     $log = __CLASS__ . '::authenticate() error: http code not 200. Responded: '.print_r($data, true);
     $return = false;
  } else {
     $this->auth = $data;
     $return = true;
     $log = __CLASS__ . '::authenticate() returns '.$return.' and sets this->auth='.print_r($data, true);
  }
  if ($this->log)
     error_log($log);
  return $return;
}

您可以使用测试文件查看我的项目there

我的问题是verify()功能。 当我想通过在浏览器中输入https://www.googleapis.com/oauth2/v2/tokeninfo?access_token=.... 来验证Google的访问令牌时,我会立即得到Google的回复但是当我尝试使用cURL执行以下功能时,它会失败地失败:

public function verify($access_token = null) {
  if (!$access_token) {
     if ($this->log)
        error_log(__CLASS__ . '::verify() error: $access_token is null.');
     return false;
  }
  $url = $this->token->get('verify_endpoint');
  $curlPost = 'access_token='. $access_token;
  //$curlPost = \http_build_query(array('access_token' => $access_token));
  //$curlPost = array('access_token' => $access_token);
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url.'?'.$curlPost);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
  //curl_setopt($ch, CURLOPT_VERBOSE, true);
  $buffer = curl_exec($ch);
  $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
  curl_close($ch);
  $data = \json_decode($buffer, true);
  if ($http_code != 200) {
     $log = __CLASS__ . '::verify() error: http code not 200. Responded: '.print_r($data, true);
     $return = false;
  } else {
     $this->verify = $data;
     $log = __CLASS__ . '::verify() sets this->verify='.print_r($data, true);
     $return = true;
  }
  if ($this->log)
     error_log($log);
  return $return;
}

这与cURL有关吗?欢迎任何答案。

只是为了澄清:浏览器请求https://www.googleapis.com/oauth2/v2/tokeninfo?access_token=...?id_token=...总是成功但不是cURL 在查询部分中使用正确的令牌

2 个答案:

答案 0 :(得分:0)

来自您的源代码here

  

$ this-> set('verify_endpoint','https://www.googleapis.com/oauth2/v2/tokeninfo');

调用googles令牌信息端点documentation用于验证您似乎正在向其传递访问令牌的ID令牌。这不会起作用。

TBH我不明白为什么你会打扰验证访问令牌。测试访问令牌是否正常工作的最佳方法是调用有问题的API,如果它不起作用,您将收到错误。你为什么要打电话来测试它是否有效,然后使用它,如果它可以使你的请求加倍。

答案 1 :(得分:0)

问题解决了!

经过2个月的搜索,在开始调查卷曲环境发送的错误后,我的项目更新版本DNS问题立即得到解决。

浏览器的成功响起了一个可能存在@sanmai问题的铃声,因为这些线程反复展示了这一点:

  1. https://r3-cev.atlassian.net/browse/CORDA-913
  2. https://curl.haxx.se/mail/curlphp-2016-10/0000.html @vincent
  3. https://forums.rancher.com/t/dns-caching-issues/1566/8
  4. https://github.com/GoogleCloudPlatform/google-cloud-php/issues/405
  5. CURLOPT_RESOLVE GET关于cUrl的{​​{1}}讨论确实让它发挥了作用!另见https://github.com/google/google-api-php-client/issues/1184; Luc van Donkersgoed提出了This,John Hart提出了php manual

    Expect请求中包含Google响应的响应标头的棘手部分将在herethere位置进行讨论。

    here下载卷曲证书。 证书的讨论是other

    有关调试cUrl therethere的讨论。

    有关{{1}}标题及其含义的讨论,您可以阅读herethere

    现在{{1}}连接谷歌时闪电般快速。查看我的this

    我对所有耐心和善意支持社区的用户表示最深切的谢意。你们真棒!非常感谢!