RefreshToken在我获得新的令牌Google工作表API

时间:2016-09-01 12:16:24

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

我正在使用带有PHP的Google工作表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()));
}

2 个答案:

答案 0 :(得分:3)

refresh_token仅在用户的第一次授权时提供。后续授权(例如您在测试OAuth2集成时所使用的类型)将不会再次返回refresh_token。 :)

  1. 转到您的帐户安全设置: https://www.google.com/settings/u/1/security
  2. 点击"授权应用程序和网站"。
  3. 旁边的修改按钮
  4. 然后点击"撤销访问权限"在您的应用旁边。
  5. 您发出的下一个OAuth2请求将返回refresh_token
  6. 或者,您可以将查询参数prompt=consent添加到OAuth重定向(请参阅Google的OAuth 2.0 for Web Server Applications页面)。

    这将提示用户再次授权该应用程序,并始终返回refresh_token

答案 1 :(得分:2)

您的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以获取更多参考。 希望这有帮助!