【问题标题】:RefreshToken Not getting send back after I get new token google sheets APIRefreshToken 在我获得新的令牌谷歌表格 API 后没有被发回
【发布时间】:2017-01-09 07:51:38
【问题描述】:

我正在使用带有 PHP 的 google sheet API 并遵循可以在此处找到的快速入门指南https://developers.google.com/sheets/quickstart/php

当我正确授权并将后续 json 文件存储在指定路径中时

{
  "access_token": "xxxxxxx",
  "token_type": "Bearer",
  "expires_in": 3600,
  "refresh_token": "xxxxxx",
  "created": 1472731452
}

到期后,我的代码中会触发以下内容

if ($client->isAccessTokenExpired()) {
    $client->fetchAccessTokenWithRefreshToken(
        $client->getRefreshToken()
    );

    $this->filesystem
        ->put(
            self::CREDENTIALS,
            json_encode($client->getAccessToken())
        );
}

现在我的问题是,当该代码被触发时,它会将我的文件更新为以下内容。

{
  "access_token": "xxxxxxx",
  "token_type": "Bearer",
  "expires_in": 3600,
  "created": 1472731452
}

如您所见,不再有刷新令牌。当此令牌过期时,我开始收到以下错误

[LogicException]
refresh token must be passed in or set as part of setAccessToken

这完全可以理解,因为我那里没有刷新令牌了。

我的问题是为什么刷新令牌会被删除?我调用的方法与快速入门指南中的方法相同https://developers.google.com/sheets/quickstart/php

我在指南中专门谈论这部分

// Refresh the token if it's expired.
if ($client->isAccessTokenExpired()) {
  $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
  file_put_contents($credentialsPath, json_encode($client->getAccessToken()));
}

【问题讨论】:

    标签: google-api google-api-php-client google-sheets-api


    【解决方案1】:

    您的refresh token expired,因为您的代码中设置的生命周期仅为 3600 秒/1 小时。

    {
    "access_token": "xxxxxxx",
    "token_type": "Bearer",
    "expires_in": 3600, //refresh_token good for 1 hour
    "refresh_token": "xxxxxx",
    "created": 1472731452
    }
    

    Using a refresh token

    第一次授权码交换时离线场景获取刷新令牌。在这些情况下,您的应用程序可能会通过向 Google OAuth 2.0 授权服务器发送刷新令牌来获取新的访问令牌。

    要以这种方式获取新的访问令牌,您的应用程序将向 https://www.googleapis.com/oauth2/v4/token 发送一个 HTTPS POST 请求。请求必须包含以下参数:

    这样的请求将类似于以下内容:

    POST /oauth2/v4/token HTTP/1.1
    Host: www.googleapis.com
    Content-Type: application/x-www-form-urlencoded
    
    client_id=8819981768.apps.googleusercontent.com&
    client_secret={client_secret}&
    refresh_token=1/6BMfW9j53gdGImsiyUH5kU5RsR4zwI9lUVX-tqf8JXQ&
    grant_type=refresh_token
    

    查看此SO thread 以获取更多参考。 希望这会有所帮助!

    【讨论】:

    • 是的,更清晰,谢谢!我只是在保存之前重新附加了刷新令牌:)
    猜你喜欢
    • 1970-01-01
    • 2020-07-26
    • 2014-03-31
    • 2013-07-20
    • 2014-03-31
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    • 2021-05-06
    相关资源
    最近更新 更多