如何使 Google 报告 API 在过期时刷新 oauth2 访问令牌?
How to make Google reporting API refresh the oauth2 access token when it expires?
我正在做一个分析 API 项目,当访问令牌在一个小时后过期时,我得到 "code:401, Invalid Credentials" 并且必须取消设置 php 会话才能重新认证。我读到我应该在第一次授权时自动收到一个刷新令牌,但我在任何地方都看不到它。我还尝试手动设置刷新令牌,从 oauth2 游乐场获得它。我怎样才能使这项工作?刷新令牌最初应该存储在 $_SESSION 中吗?
有问题的代码:
require_once __DIR__ . '/vendor/autoload.php';
$client = new Google_Client();
$client->setAuthConfig(__DIR__ . '/client_secrets.json');
$client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php');
$client->setAccessType('offline');
$client->setApprovalPrompt('force');
$client->setIncludeGrantedScopes(true);
$client->addScope(Google_Service_Analytics::ANALYTICS_READONLY);
if (isset($_SESSION['access_token']) && $_SESSION['access_token']) {
$client->setAccessToken($_SESSION['access_token']);
$analytics = new Google_Service_Analytics($client);
} else {
$redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php';
header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL));
}
$_SESSION 中的访问令牌
[access_token] => blahblahblah
[expires_in] => 3600
[scope] => https://www.googleapis.com/auth/analytics.readonly
[token_type] => Bearer
[created] => 1537207944
您只会在第一次授权时获得刷新令牌。您可能需要取消对您的应用程序的授权,然后重试。您可以将 RT 存储在任何您喜欢的地方,前提是它是安全的。要使用您的 RT 获取访问令牌,请参阅 https://developers.google.com/identity/protocols/OAuth2WebServer#offline
所以,经过大量挖掘和修补,我终于让它工作了。我一直看到对
的引用
$client->setAccessType('offline');
和
$client->setApprovalPrompt('force');
是我问题的解决方案,但它们对我不起作用。事实证明,它们需要添加到 oauth2callback.php,而不是任何其他报告或管理文件。这是骗人的,因为其他文件也在操纵 $client 对象。我终于在 $_SESSION['access_token'] 中收到了一个 refresh_token,它似乎正在自行处理刷新,无需任何进一步操作。
我正在做一个分析 API 项目,当访问令牌在一个小时后过期时,我得到 "code:401, Invalid Credentials" 并且必须取消设置 php 会话才能重新认证。我读到我应该在第一次授权时自动收到一个刷新令牌,但我在任何地方都看不到它。我还尝试手动设置刷新令牌,从 oauth2 游乐场获得它。我怎样才能使这项工作?刷新令牌最初应该存储在 $_SESSION 中吗?
有问题的代码:
require_once __DIR__ . '/vendor/autoload.php';
$client = new Google_Client();
$client->setAuthConfig(__DIR__ . '/client_secrets.json');
$client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php');
$client->setAccessType('offline');
$client->setApprovalPrompt('force');
$client->setIncludeGrantedScopes(true);
$client->addScope(Google_Service_Analytics::ANALYTICS_READONLY);
if (isset($_SESSION['access_token']) && $_SESSION['access_token']) {
$client->setAccessToken($_SESSION['access_token']);
$analytics = new Google_Service_Analytics($client);
} else {
$redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php';
header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL));
}
$_SESSION 中的访问令牌
[access_token] => blahblahblah
[expires_in] => 3600
[scope] => https://www.googleapis.com/auth/analytics.readonly
[token_type] => Bearer
[created] => 1537207944
您只会在第一次授权时获得刷新令牌。您可能需要取消对您的应用程序的授权,然后重试。您可以将 RT 存储在任何您喜欢的地方,前提是它是安全的。要使用您的 RT 获取访问令牌,请参阅 https://developers.google.com/identity/protocols/OAuth2WebServer#offline
所以,经过大量挖掘和修补,我终于让它工作了。我一直看到对
的引用$client->setAccessType('offline');
和
$client->setApprovalPrompt('force');
是我问题的解决方案,但它们对我不起作用。事实证明,它们需要添加到 oauth2callback.php,而不是任何其他报告或管理文件。这是骗人的,因为其他文件也在操纵 $client 对象。我终于在 $_SESSION['access_token'] 中收到了一个 refresh_token,它似乎正在自行处理刷新,无需任何进一步操作。