首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >谷歌硬盘OAuth => response=Moved

谷歌硬盘OAuth => response=Moved
EN

Stack Overflow用户
提问于 2014-09-04 10:04:44
回答 1查看 1K关注 0票数 0

我正在尝试编写一个小型PHP代码,它应该能够对Google帐户进行身份验证,然后将一个文件上传到它的Google。

这一过程应分两个步骤进行:

  1. 发送身份验证请求并交换授权代码
  2. 发布授权代码并交换用于向Google发送其他请求(eq:文件上载)的访问令牌

注意,通过使用Google客户端库,一切工作都很顺利。

我想要实现的是不使用Google,而是使用描述这里的简单身份验证步骤。

通过使用前面提到的这些身份验证步骤,我发送了一个请求:

Id=[我的客户id]

作为交换,重定向页面应该包含"code=xxxx“参数,例如:

http://example.com?code=xxx

其中xxx是由Google加到上面提到的redirect_uri的授权代码。

问题是,谷歌返回一个错误消息,比如临时移动,还提供了一个链接“文档移动了这里”。如果我点击那个链接,那么一切都很好。

但我不希望用户干预,因为这段代码在服务器级别工作,而不是在客户端级别。

如何解决这个?请不要回答“使用谷歌客户端库!”因为我已经说过这样做会有效,但我不希望Google客户端库依赖!

我的PHP代码是:

代码语言:javascript
运行
复制
$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;
?>
EN

回答 1

Stack Overflow用户

发布于 2014-09-04 10:49:34

这类问题的解决方案是

  • 不要通过CURL调用第一个请求,而是通过更改文档位置来调用

还请更改此块:

代码语言:javascript
运行
复制
...
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);
}

有了这个:

代码语言:javascript
运行
复制
...
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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25662642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档