首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >谷歌OAuth 2新令牌总是过期

谷歌OAuth 2新令牌总是过期
EN

Stack Overflow用户
提问于 2018-03-28 19:33:27
回答 2查看 619关注 0票数 0

我已经完成了授权步骤,其中google请求帐户的权限,并要求用户验证,它返回访问令牌,刷新令牌类型的持有者。

然后我将令牌保存在数据库中。在一个不同的php文件中,我使用了以下代码:

代码语言:javascript
复制
require __DIR__ . '/foo/Google/autoload.php';
$client = new Google_Client();
$client->setClientId("foo.apps.googleusercontent.com");
$client->setClientSecret("foo");
$client->setAccessToken($access_token);
$expired = $client->isAccessTokenExpired();
if($expired == 1)
{
$new_token = $client->fetchAccessTokenWithRefreshToken($refresh_token);
print_r($new_token);
$access_token = $new_token['access_token'];
send("UPDATE `foo_table` SET `access_token`='$access_token' WHERE `foo` = '$foo'");
$client->setAccessToken($access_token);
$expired = $client->isAccessTokenExpired();
echo $expired;
} 
if($expired == 0)
{ 
code..

我总是得到一个新的令牌,以及相同的初始刷新令牌,但它总是过期的,在同一页面中,并且在刷新时(使用存储的令牌)。php在google api的授权Uris中。

代码语言:javascript
复制
Array
(
[access_token] = foobar
[token_type] = Bearer
[expires_in] = 3600
[created] = 1522234588
[refresh_token] = Foobar
)
1 (Expired)

我将它用于gmail api,初始作用域:

代码语言:javascript
复制
$client->addScope("https://mail.google.com/");
$client->addScope("https://www.googleapis.com/auth/gmail.compose");
$client->addScope("https://www.googleapis.com/auth/gmail.send");
$client->addScope("https://www.googleapis.com/auth/gmail.readonly");
EN

回答 2

Stack Overflow用户

发布于 2018-03-28 19:50:48

我想你误解了访问令牌和刷新令牌的用法。将访问令牌保存到数据库中是没有意义的。访问令牌的有效期仅为一个小时。您应该保存刷新令牌。

当您的代码需要运行时,您需要获取刷新令牌并请求一个新的访问令牌。

代码语言:javascript
复制
if ($client->isAccessTokenExpired()) {              
                $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
                $client->setAccessToken($client->getAccessToken()); 
                $_SESSION['access_token'] = $client->getAccessToken();              
            }           

摘自Oauth2Authentication.php的代码

票数 0
EN

Stack Overflow用户

发布于 2018-10-03 02:37:02

如果您真的想/需要将访问令牌存储在数据库中,您可以这样做。由于访问令牌是一个包含access_tokenexpires_inscopetoken_type等的数组...您必须将整个数组存储在数据库中。你能做的是:

代码语言:javascript
复制
$accessToken = $client->getAccessToken();
$serializedAccessToken = serialize($accessToken);

$insertIntoDatabase = insert($serializedAccessToken)......

现在,如果您想从数据库中检索访问令牌并检查它是否已过期,您可以这样做:

代码语言:javascript
复制
$getAccessToken = getFromDatabase...
$accessTokenArray = unserialize($getAccessToken);

if($client->isAccessTokenExpired()) {
    $client->refreshToken($refreshToken);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49533417

复制
相关文章

相似问题

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