将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:调用使用访问令牌的方法并检查其响应。如果呼叫成功,则访问令牌必须保持良好状态,否则我可以继续请求新的。但我可以用什么方法打电话?只需要最基本权限的人就会很好。
谢谢。
答案 0 :(得分:1)
你可以每次都请求一个新令牌,但这是不必要的开销,我相信它也会影响你的API调用配额。
我基本上做#2,但我也减去了expires_in
的10秒钟,以确保我没有使用刚过期的令牌发出请求。 TBH没有理由认为Google会撤销一个不会导致所有访问完全撤销的单个令牌,这就是为什么他们的令牌生命周期如此之短的原因。
我没有使用官方API客户端,但我的逻辑Cliff的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;
}
}