【问题标题】:Can you reuse a Google service account access token?您可以重复使用 Google 服务帐户访问令牌吗?
【发布时间】:2017-05-07 13:50:31
【问题描述】:

将 Google API PHP 客户端与服务帐户一起使用,它会返回一个如下所示的数组:

array (size=3)
  'access_token' => string '...TOKEN...' (length=127)
  'token_type' => string 'Bearer' (length=6)
  'expires_in' => int 3600

每个页面请求都生成一个新令牌是最佳做法吗?当每个令牌有效期为一小时时,这样做似乎很浪费。但由于令牌不包含created 值或token_id 值,因此内置的isAccessTokenExpired() 方法将始终返回true,这意味着它始终过期。

我看到了重用同一个令牌的几个选项:

选项 1:当通过 fetchAccessTokenWithAssertion() 创建令牌时,我可以手动将 created 值添加到令牌数组中,并以 time() 作为其值。然后将其保存到会话/数据库中,以便稍后在调用 isAccessTokenExpired 时,它将对该字段进行验证。

选项 2:将令牌连同令牌将过期的时间戳一起保存到会话/数据库 (time() + $token['expires_in']),然后在后续视图中,我可以进行自己的计算以验证令牌是否仍在有效时间段内。这似乎也有点奇怪,因为我不能完全确定谷歌没有撤销令牌或类似的有趣事情。

选项 3:调用使用访问令牌并检查其响应的方法。如果调用成功,那么访问令牌必须仍然是好的,如果不是,那么我可以继续要求一个新的。但是我可以调用什么方法?只需要最基本的权限就可以了。

谢谢。

【问题讨论】:

    标签: oauth google-api google-oauth access-token google-api-client


    【解决方案1】:

    可以每次都请求一个新令牌,但这是不必要的开销,而且我相信它也会占用您的 API 调用配额。

    我基本上做#2,但我也从expires_in 中减去 10 秒,以确保我没有使用刚刚过期的令牌发出请求。 TBH,谷歌没有理由撤销不会导致所有访问权限完全撤销的单个令牌,这就是为什么他们的令牌生命周期开始时如此短的原因。

    我没有使用官方 API 客户端,但是我的逻辑的 Cliff's Notes 版本是:

    class Token {
        public function __construct($info) {
            $this->token    = $info['access_token'];
            $this->type     = $info['token_type'];
            $this->expiry   = time() + $info['expires_in'] - 10;
        }
    
        public function isValid() {
            return ($this->validFor()) > 0;
        }
    
        public function validFor() {
            return $this->expiry - time();
        }
    }
    
    class TokenFactory implements TokenFactoryInterface {
        public function token($force_new=false) {
            if( $force_new || !isset($this->token) || !$this->token->isValid() ) {
                $this->token = $this->newToken();
            }
    
            return $this->token;
        }
    }
    

    【讨论】:

    • 感谢您的回答并确认我的想法@sammitch。这正是我现在决定做的事情。我只是将令牌与过期时间戳一起存储在 PHP 会话中。
    猜你喜欢
    • 2019-01-05
    • 1970-01-01
    • 2012-05-27
    • 2015-04-29
    • 1970-01-01
    • 2016-04-29
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多