通过这个简单的代码,我设法获得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 在查询部分中使用正确的令牌
答案 0 :(得分:0)
来自您的源代码here
$ this-> set('verify_endpoint','https://www.googleapis.com/oauth2/v2/tokeninfo');
调用googles令牌信息端点documentation用于验证您似乎正在向其传递访问令牌的ID令牌。这不会起作用。
TBH我不明白为什么你会打扰验证访问令牌。测试访问令牌是否正常工作的最佳方法是调用有问题的API,如果它不起作用,您将收到错误。你为什么要打电话来测试它是否有效,然后使用它,如果它可以使你的请求加倍。
答案 1 :(得分:0)
问题解决了!
经过2个月的搜索,在开始调查卷曲环境发送的错误后,我的项目更新版本DNS
问题立即得到解决。
浏览器的成功响起了一个可能存在@sanmai
问题的铃声,因为这些线程反复展示了这一点:
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响应的响应标头的棘手部分将在here和there位置进行讨论。
有关{{1}}标题及其含义的讨论,您可以阅读here和there。
现在{{1}}连接谷歌时闪电般快速。查看我的this。
我对所有耐心和善意支持社区的用户表示最深切的谢意。你们真棒!非常感谢!