0

使用谷歌API PHP客户端与服务帐户,它返回类似如下的数组:您可以重复使用Google服务帐户访问令牌吗?

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:调用使用访问令牌并检查其响应的方法。如果通话成功,那么访问令牌一定是好的,如果不是的话,我可以继续请求一个新的。但是我可以调用什么方法?一个只需要最基本的权限就是好的。

谢谢。

回答

1

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

我基本上做了#2,但我也从expires_in减去了10秒,只是为了确定我没有使用刚过期的令牌进行请求。 TBH没有任何理由说Google会撤销一个不会导致全部撤销所有访问的个人令牌,这就是为什么他们的令牌生命周期非常短暂。

我不使用官方的API客户端,但我的逻辑悬崖的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; 
    } 
} 
+0

谢谢您的回答,并确认我的想法@sammitch。这正是我现在决定要做的。我只是将令牌和expires时间戳一起存储在PHP会话中。 – Corey

相关问题