我使用access_token
对google api进行了许多不同的api调用,因此我需要在access_token
过期时处理案例并交换refresh_token
以获取新案例。
这样做的最佳方式是什么?
我想用try{}catch(){}
阻止每个API调用。
如果异常增加,我会在catch()
块中进行另一次API调用,以通过access_token
端点验证https://www.googleapis.com/oauth2/v1/tokeninfo?access_token={accessToken}
。
将每个API调用转换为try() catch(){}
块并复制catch()逻辑可能不是一个好主意。
我怎样才能做得更好?
P.S。我正在使用guzzle库进行API调用。
答案 0 :(得分:0)
如果您使用Google提供的图书馆拨打电话,我建议您检查图书馆是否尚未处理您的重试。 Java库就是这样做的,我怀疑Python库也可以。
如果您没有使用图书馆,check if there would not be one available for your language。如果能帮到你。
如果您真的没有选择且无法使用Google的库,那么我建议您在自己的代码中模仿他们的行为。这意味着创建一种GoogleRequest
行为(类,模块或类似的东西,取决于您的语言)。此行为将提供execute()
方法,该方法将处理身份验证错误,刷新令牌并重试请求。
顺便说一下,用于刷新令牌的URL不是您在问题中列出的URL。您必须使用此正文向网址POST
发送https://www.googleapis.com/oauth2/v3/token
个请求:
client_secret=YOUR_CLIENT_SECRET&grant_type=refresh_token&refresh_token=YOUR_REFRESH_TOKEN&client_id=YOUR-CLIENT_ID
答案 1 :(得分:0)
将它包装在一个尝试捕获是一个非常糟糕的主意,因为那时你将提出一个请求并将其放大,因此你需要另外一个。这可能会增加你的配额。没有理由向API发送请求以确定您的访问令牌是否已过期。
访问令牌有效期为1小时。您可以使用它来确定是否需要刷新访问令牌。它是Google-api-php-client库如何做到的。
我真的建议你使用谷歌的客户端库,它会让你更轻松。
答案 2 :(得分:0)
我是反图书馆的人,所以我会说阅读https://developers.google.com/accounts/docs/OAuth2WebServer#refresh并做一个简单的POST并解析JSON响应。它没有那么简单。
答案 3 :(得分:0)
如果您只是使用PHP的Google API客户端库,PHP代码交换很容易。来自the Google+ Quickstart sample:
$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());