我使用access_token
对google api进行了许多不同的api调用,因此我需要在access_token
过期时处理案例,并交换refresh_token
以获得新的。
最好的方法是什么?
我猜每个API调用都要使用try{}catch(){}
块。
如果出现异常,在catch()
块中,我将进行另一个API调用,以通过https://www.googleapis.com/oauth2/v1/tokeninfo?access_token={accessToken}
端点验证access_token
。
将每个API调用都转换为try() catch(){}
块和重复catch()逻辑可能不是一个好主意。
我怎样才能做得更好?
附言:我正在使用guzzle库进行API调用。
如果您使用谷歌提供的库进行调用,那么我建议您检查该库是否尚未为您处理重试。Java库做到了这一点,我怀疑Python库也做到了。
如果你没有使用库,请检查是否没有适合你的语言的库。如果对你有很大帮助。
如果你真的没有选择,也不能使用谷歌的库,那么我建议你在自己的代码中模仿它们的行为。这意味着创建一种GoogleRequest
行为(一个类、一个模块或类似的东西,具体取决于您的语言)。此行为将提供一个execute()
方法,该方法将处理身份验证错误、刷新令牌并重试请求。
顺便说一句,用于刷新令牌的URL不是您在问题中列出的URL。您必须向URL https://www.googleapis.com/oauth2/v3/token
发送一个POST
请求,其正文为:
client_secret=YOUR_CLIENT_SECRET&grant_type=refresh_token&refresh_token=YOUR_REFRESH_TOKEN&client_id=YOUR-CLIENT_ID
将其封装在try-catch中是一个非常糟糕的主意,因为然后您将提出一个请求并将其关闭,因此您需要获得另一个请求。这可能会增加你的配额。没有理由向API发送请求以查明您的访问令牌是否过期。
访问令牌有效期为1小时。您可以使用它来决定是否需要刷新您的访问令牌。这就是Google api php客户端库的工作原理
我真的建议你使用谷歌的客户端库,它会让你的事情变得更容易。
我是反图书馆的人,所以我会说读https://developers.google.com/accounts/docs/OAuth2WebServer#refresh只需进行简单的POST并解析JSON响应。它并没有变得简单多少。
如果您只使用Google API客户端PHP库,PHP代码交换就很容易了。来自Google+Quickstart示例:
$client = new Google_Client();
$client->setApplicationName('YOUR_APP_NAME';);
$client->setClientId('YOUR_CLIENT_ID';);
$client->setClientSecret('YOUR_CLIENT_SECRET';);
$client->setRedirectUri('postmessage');
// Code came from a POST
$code = $request->getContent();
// Exchange the OAuth 2.0 authorization code for user credentials.
$client->authenticate($code);
$token = json_decode($client->getAccessToken());