如何更改 Google Access Token 的过期时间?

Posted

技术标签:

【中文标题】如何更改 Google Access Token 的过期时间?【英文标题】:How to change the expiration time of a Google Access Token? 【发布时间】:2021-12-29 06:15:54 【问题描述】:

我有这段代码在 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;
  

?>

【问题讨论】:

【参考方案1】:

欢迎来到 Oauth2 的世界。

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

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

就是这么说的。

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

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

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

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

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

【讨论】:

但是先生,我想以这种方式更改到期时间,例如令牌的到期时间为 1 小时,我希望将其设置为 30 分钟。这可能吗?? 不,女士,这是不可能的,除非您拥有授权服务器。 @HIMANSHUSINGH 据我所知,没有办法“设置”它的具体时间。如果你想让你的令牌过期,只需请求另一个令牌,那么第一个令牌就会过期。因此,也许,编写一个计时器以每 30 分钟请求一个新令牌。希望这会对您的要求有所帮助。 @BobTheCat 如果您想验证您的陈述,而不仅仅是说据我所知您可以咨询The OAuth 2.0 Authorization Framework 这部分描述了访问令牌的工作原理。 TBH 未来如果你不知道答案最好不要发表评论,因为错过的信息可能会混淆问题并混淆人们。欢迎来到堆栈溢出。 @BobTheCat 所以,也许,写一个计时器,每 30 分钟请求一个新令牌。 在某些授权服务器的情况下,这可能不起作用,有些可能只是返回给您他们第一次给你的同一个令牌。如果您阅读了作者希望他的令牌持续 200 天而不是 30 分钟的问题,那么您的陈述实际上对他们没有帮助,因为按照设计,访问令牌将在 3600 秒或一小时后过期。

以上是关于如何更改 Google Access Token 的过期时间?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用google-api-nodejs-client的情况下处理Google API access_token已过期?

如何从 android oAuth 的刷新令牌中获取 access_token

带有 Google 服务帐户主题的 generate_access_token()

Google OAuth2 .Net HttpPost 请求 access_token 中缺少 refresh_token

access_token 无效时的 Google Calendar API

我在哪里可以检查 google oauth 2.0 access_token 是不是有效?