我正尝试在我的网络应用中使用google plus Api登录。
我从https://developers.google.com/oauthplayground/https://developers.google.com/oauthplayground/搜索了它 我申请了他们。
当我向https://www.googleapis.com/oauth2/v3/token请求时,它会返回
if(isset($_GET['code'])) {
// try to get an access token
$code = $_GET['code'];
$url = 'https://www.googleapis.com/oauth2/v3/token';
$params = array(
"code" => $code,
"client_id" => "************************",
"client_secret" => "************************",
"redirect_uri" => "http://localhost/googleplus/oauth2callback.php",
"grant_type" => "authorization_code"
);
$json=CallAPI('POST',$url,$params);
我正在处理正在执行请求的代码片段(作为客户端ID和密码作为星号) 我不明白,也许你可以帮忙。
function CallAPI($method, $url, $data = false)
{
$curl = curl_init();
switch ($method)
{
case "POST":
curl_setopt($curl, CURLOPT_POST, 1);
if ($data)
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
break;
case "PUT":
curl_setopt($curl, CURLOPT_PUT, 1);
break;
default:
if ($data){
$url = sprintf("%s?%s", $url, http_build_query($data));
echo $url;
}
}
// Optional Authentication:
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($curl, CURLOPT_USERPWD, "username:password");
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($curl);
curl_close($curl);
return $result;
}
和我的CALLAPI函数
{{1}}
答案 0 :(得分:1)
您的要求是正确的,但遗漏了一些东西
内容类型不是multipart/form-data
应该application/x-www-form-urlencoded
而是
答案 1 :(得分:0)
我使用OAuth2.0从iOS应用程序访问Gmail时遇到了类似的问题。确实艾哈迈德的建议是正确的我会扩展它:
使用HTTP进行POST时,会有一个标题字段“Content-Type:”。在您的情况下,它的默认值为'multipart / form-data',用于二进制数据。对于Google API OAuth2.0,请务必将其设置为'application / x-www-form-urlencoded'。
您可以在此处给出的示例中看到此值: https://developers.google.com/identity/protocols/OAuth2InstalledApp#handlingtheresponse
您可以在此处详细了解“Content-Type”的这两个值: application/x-www-form-urlencoded or multipart/form-data?
在我的iOS框架中,我不得不调用自定义此HTTP标头。不幸的是我不熟悉PHP所以希望有所帮助。
答案 2 :(得分:0)
我有一个非常类似的问题。我终于能够通过向HTTP头添加一些元素(“Content-Type”和“Content-Length”)并手动构建url来解决它(所以我可以使用0代表“Content-Length”)。
$id_token = $_POST['id_token'];
$url = 'https://www.googleapis.com/oauth2/v3/tokeninfo?id_token='.$id_token;
$options = [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_POST => 1,
CURLOPT_HTTPHEADER => array( "Content-Length: 0", "Content-Type: application/x-www-form-urlencoded"),
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_SSL_VERIFYPEER => false,
];
$curlObj = curl_init();
curl_setopt_array($curlObj, $options);
$returnData = curl_exec($curlObj);
if (curl_errno($curlObj)) {
//error message
$returnData = curl_error($curlObj);
}
echo $returnData;
答案 3 :(得分:-1)
if(isset($_REQUEST['code'])){
$ch =curl_init();
$auth_url = "https://www.googleapis.com/oauth2/v4/token";
$post = array(
'code' =>$_REQUEST['code'],
'client_id' => '**************',
'client_secret' => '************',
'redirect_uri' => 'http://localhost/prakash/redirect.php',
'grant_type' => 'authorization_code'
);
$postText = http_build_query($post);
$options = array(
CURLOPT_URL =>$auth_url,
CURLOPT_POST => true,
CURLOPT_SSL_VERIFYPEER =>false,
CURLOPT_RETURNTRANSFER =>true,
CURLOPT_POSTFIELDS => $postText
);
//print_r($ch);
curl_setopt_array($ch, $options);
$returnData = curl_exec($ch);
print_r($returnData);
curl_close($ch);
exit;
}else{
print_r($_REQUEST);
exit;
}