所以我在页面顶部定义了所有参数:
<?php
session_start();
$client = new Google_Client();
$client->setAuthConfigFile('client_secrets.json');
$client->addScope(Google_Service_Analytics::ANALYTICS_READONLY);
$client->setAccessType('offline');
$client->setApprovalPrompt('force');
if (isset($_SESSION['access_token']) && $_SESSION['access_token']) {
$client->setAccessToken($_SESSION['access_token']);
$client->getAccessToken();
} else {
$redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php';
header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL));
}
//get the access token
$myToken = json_decode($client->getAccessToken());
if ($client->getAuth()->isAccessTokenExpired()) {
$token = $myToken->refresh_token;
echo 'token expired';
} else {
$token = $myToken->access_token;
echo 'token not yet expired';
}
?>
在底部我得到了java脚本:
<script>
gapi.analytics.ready(function() {
var CLIENT_ID = 'my-client-id-goes-here';
gapi.analytics.auth.authorize({
'serverAuth': {
'access_token': '<?php echo $token; ?>'
}
});
然而,这将有效,直到访问令牌到期,这是在60分钟内。之后报告不再显示。我做错了什么以及为什么它没有使用刷新令牌?
答案 0 :(得分:0)
这实际上是预期的行为(不幸的是)。 Embed API不会使用刷新令牌,因为通常您永远不想公开公开这些令牌(如果它们位于您的HTML源代码中,您将会这样做)。
如果您想要解决此限制,可以在页面上设置一个计时器,每50分钟左右更新一次访问令牌(它们会在60之后到期,如您所指出的那样)。
如果您的服务器上有一个返回新访问令牌的端点,您可以执行以下操作:
setInterval(function() {
makeRequestToGetNewAccessToken().then(function(access_token) {
gapi.auth.setToken({
access_token: access_token
});
});
}, 1000 * 60 * 50);
注意,上面的关键是使用新的访问令牌调用setToken
。这将允许Embed API继续正常工作。