首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何更改Google访问令牌的过期时间?

如何更改Google访问令牌的过期时间?
EN

Stack Overflow用户
提问于 2021-11-18 10:44:50
回答 1查看 720关注 0票数 2

我使用php中的oauth 2.0API对用户进行身份验证,但我想更改令牌的过期时间,通常令牌在1小时后过期,但我必须将其更改为最大时间,我认为是200天。我如何才能做到这一点。如有任何帮助或建议,我们将不胜感激。

代码语言:javascript
运行
复制
<?php
  class Connection {
    public function __construct() {
        $this->credentials = "credentials.json";
        $this->client = $this->create_client();
    }

    public function get_client() {
      return $this->client;
    }

    public function get_credentials() {
      return $this->credentials;
    }

    public function is_connected() {
      return $this->is_connected;
    }

    public function get_unauthenticated_data() {
      $authUrl = $this->client->createAuthUrl();
      return "<a href='$authUrl'>Click here to link your account</a>";
    }

    public function credentials_in_browser() {
      if ($_GET['code']) {
        return true;
      }
      return false;
    }

    public function create_client() {
      $client = new Google_Client();
      $client->setApplicationName('Gmail API PHP');
      $client->addScope('https://mail.google.com/');
      $client->setAuthConfig('credentials.json');
      $client->setAccessType('offline');
      $client->setPrompt('select_account consent');
      $tokenPath = 'token.json';
      if (file_exists($tokenPath)) {
          $accessToken = json_decode(file_get_contents($tokenPath), true);
          $client->setAccessToken($accessToken);
      }

      if ($client->isAccessTokenExpired()) {
          if ($client->getRefreshToken()) {
              $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
          } elseif($this->credentials_in_browser()) {
            $authCode = $_GET['code'];
            $accessToken = $client->fetchAccessTokenWithAuthCode($authCode);
            $client->setAccessToken($accessToken);

            if (array_key_exists('error', $accessToken)) {
                throw new Exception(join(', ', $accessToken));
            }
          } else {
            $this->is_connected = false;
            return $client;
          }
          if (!file_exists(dirname($tokenPath))) {
              mkdir(dirname($tokenPath), 0700, true);
          }
          file_put_contents($tokenPath, json_encode($client->getAccessToken()));
      }
      else {}

      $this->is_connected = true;
      return $client;
  }
}
?>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-18 11:49:38

欢迎来到Oauth2的世界。

标准访问令牌在一个小时后过期。这是由创建它的授权服务器配置的。因此,如果您拥有创建它的授权服务器,您将有权更改过期时间。

谷歌访问令牌是由谷歌授权服务器创建的,谷歌访问令牌在一个小时后过期。您没有权限更改此设置。

话虽如此。

您的代码似乎正在使用脱机访问并使用刷新令牌来请求新的访问令牌。

代码语言:javascript
运行
复制
if ($client->getRefreshToken()) {
          $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());

只要您的应用程序设置为生产,刷新令牌就是长期存在的,您的刷新令牌不应该过期。然后,您的代码将在需要新的访问令牌时请求一个新的访问令牌。

因此,从技术上讲,您不需要将访问令牌设置为200天,您的刷新令牌应该已经比这更长了。

请注意,如果用户更改其密码,gmail api刷新令牌将过期。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70018460

复制
相关文章

相似问题

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