我正在尝试制作一些脚本,这会自动将Joomla 添加新页面的事件添加到Google日历中。我使用这个代码制作它甚至可以工作,但只有很短的时间。
我可能会误解,Google授权是如何运作的。首先,我必须授权脚本使用该日历等。我做了一次,但一小时后我不得不再做一次。我想永久地或至少一年(超过一小时)授权它。而且我甚至无法在保存过程中对其进行授权,因为它在保存脚本中会自动重定向回管理后。
还有一件事要提到:有一个重定向uri,我将它设置在管理页面的index.php上。不确定它是否有问题,但它不应该因为在index.php上添加了新闻?......所以它仍然是同一页。
但这一切都工作了一个小时(或周围的东西),所以我认为问题不是重定向uri。 THX
这是我的代码(从某些google api示例页面粘贴的副本):
require_once "google-api-php-client/src/Google_Client.php";
require_once "google-api-phpclient/src/contrib/Google_CalendarService.php";
session_start();
$client = new Google_Client();
$client->setApplicationName("Add Google Calendar Entries");
$client->setClientId('####');
$client->setClientSecret('####');
$client->setRedirectUri('####');
$client->setDeveloperKey('####');
$cal = new Google_CalendarService($client);
if (isset($_GET['logout'])) {
unset($_SESSION['token']);
}
if (isset($_GET['code'])) {
$client->authenticate($_GET['code']);
$_SESSION['token'] = $client->getAccessToken();
header('Location: http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']);
}
if (isset($_SESSION['token'])) {
$client->setAccessToken($_SESSION['token']);
}
if ($client->getAccessToken()) {
$calList = $cal->calendarList->listCalendarList();
$_SESSION['token'] = $client->getAccessToken();
$event = new Google_Event();
// some calendar adding stuff
} else {
$authUrl = $client->createAuthUrl();
print "<a class='login' href='$authUrl'>Authorize!</a>";
}
// Google Calendar API END
}
总结一下:我希望我的授权工作时间更长,也许我的代码或我对其工作方式的理解存在错误。
答案 0 :(得分:1)
获取长期访问权限的关键部分,如果要求&#34;离线&#34;请求授权时从用户访问。
$client->setAccessType('offline');
$authUrl = $client->createAuthUrl();
这应该返回刷新令牌以及当前会话令牌。你必须保存这个刷新令牌。即使他们稍后再次授权应用程序,也不会再次发送刷新令牌。 (并且就此而言,如果他们已经获得授权并且您在添加离线访问后再次授权,则有时您将无法获得刷新令牌。)
然后你可以像下面那样进行检查以保持他们的登录状态:
$client->setAccessToken($site->token);
if($client->isAccessTokenExpired()) {
$NewAccessToken = json_decode($client->getAccessToken());
$client->refreshToken($NewAccessToken->refresh_token);
}
最后,我应该补充一点,您需要将accessToken保存到数据库而不仅仅是会话,以实际使其在不同的会话中保持不变。希望这已经很明显了。