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

How to change the expiration time of a Google Access Token?

我有这段代码可以在 php 中使用 oauth 2.0 api 对用户进行身份验证,但我想更改令牌的到期时间,通常令牌会在 1 小时后到期,但我必须更改它的最长时间我认为是 200 天。我怎样才能做到这一点。任何帮助或建议将不胜感激

<?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;
  }
}
?>

欢迎来到 Oauth2 的世界。

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

Google 访问令牌由 Googles 授权服务器创建,Googles 访问令牌在一小时后过期。您无权更改此项。

话虽这么说。

您的代码似乎在使用离线访问并使用刷新令牌请求新的访问令牌。

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

只要您的应用程序处于生产状态,刷新令牌就会长期有效,您的刷新令牌不应过期。然后,您的代码将在需要时请求新的访问令牌。

所以从技术上讲,您不需要将访问令牌设置为 200 天,您的刷新令牌应该已经比那个时间长了。

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