我正在尝试编写一个小型PHP代码,该代码应该能够对Google帐户进行身份验证,然后将文件上传到其Google云端硬盘。
此过程应分两步完成:
请注意,使用Google Client Library一切顺利。
我想要达到的目的是不使用Google客户端库,而是使用here所述的简单身份验证步骤。
通过使用前面提到的这些身份验证步骤,我发送了一个请求:
作为交换,重定向页面应包含“code = xxxx”参数,如:
其中xxx是Google前面提到的上述 redirect_uri 的授权码。
问题是,Google会返回错误消息,例如暂时移动,并提供“文档已移动here。”的链接。如果我点击该链接,那么一切正常。
但我不希望用户干预,因为此代码在服务器级别而不是在客户端级别工作。
如何解决此问题?请不要回答“使用Google客户端库”!因为我已经说过这样做会有效,但我不想要谷歌客户端库依赖!
我的PHP代码是:
$CLIENT_ID = '[the client ID from Google Developer Console]';
$CLIENT_SECRET = '[the client secret from Google Developer Console]';
$REDIRECT_URI = 'http' . ($_SERVER['SERVER_PORT'] == 80 ? '' : 's') . '://' . $_SERVER['SERVER_NAME'] . $_SERVER['SCRIPT_NAME'];
$ch = curl_init();
if (isset($_GET['code']))
{
$url = 'https://accounts.google.com/o/oauth2/token';
$post_fields = 'code=' . $_GET['code'] . '&client_id=' . $CLIENT_ID . '&client_secret=' . $CLIENT_SECRET . '&redirect_uri='
. $REDIRECT_URI . '&grant_type=authorization_code';
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER,
array('Host:accounts.google.com', 'Content-Type:application/x-www-form-urlencoded', 'Content-Length:' . strlen($post_fields))
);
}
else
{
$url = sprintf('https://accounts.google.com/o/oauth2/auth?scope=email%%20profile&redirect_uri=%s&response_type=code&client_id=%s',
$REDIRECT_URI, $CLIENT_ID
);
}
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
$result = curl_exec($ch);
$error_no = curl_errno($ch);
curl_close($ch);
echo $result;
?>
答案 0 :(得分:0)
此类问题的解决方案是:
同时更改此块:
...
else
{
$url = sprintf('https://accounts.google.com/o/oauth2/auth?scope=email%%20profile&redirect_uri=%s&response_type=code&client_id=%s',$REDIRECT_URI, $CLIENT_ID);
}
这一个:
...
else
{
$url = sprintf('https://accounts.google.com/o/oauth2/auth?scope=email%%20profile&redirect_uri=%s&response_type=code&client_id=%s',$REDIRECT_URI, $CLIENT_ID);
header('Location:'.$url);
}