将refresh_token交换为access_token的最佳方法是什么? (Google API)

时间:2015-03-23 08:45:51

标签: php google-api google-oauth guzzle

我使用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调用。

4 个答案:

答案 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());