如何使Google Reporting API过期时刷新oauth2访问令牌?

时间:2018-09-17 18:22:18

标签: php oauth-2.0 google-oauth google-analytics-api

我正在研究Analytics 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

2 个答案:

答案 0 :(得分:0)

您只会在首次验证时获得一个刷新令牌。您可能需要取消对应用程序的授权,然后重试。只要安全,就可以将RT存储在任意位置。要使用RT获取访问令牌,请参见https://developers.google.com/identity/protocols/OAuth2WebServer#offline

答案 1 :(得分:0)

因此,经过大量的挖掘和修补,我终于使它起作用。我一直看到对

的引用
$client->setAccessType('offline'); 

$client->setApprovalPrompt('force');

是解决我的问题的方法,但是他们没有为我工作。原来,它们需要添加到oauth2callback.php中,而不是其他任何报告或管理文件中。这是在欺骗,因为其他文件也操纵了$ client对象。我终于在$ _SESSION ['access_token']中收到了refresh_token,它现在似乎可以自行处理刷新,而无需任何进一步的操作。