谷歌api授权时间长


Google api authorization for long time

我正在尝试制作一些脚本,它将自动添加Joomla中的事件,并将新页面添加到谷歌日历中。我用这个代码做了它,它甚至可以工作,但只是在很短的时间内。

我可能误解了谷歌授权的工作原理。首先,我必须授权脚本使用那个日历等等。我做过一次,但一个小时后我不得不再做一次。我想永久授权,或者至少授权一年(超过一个小时)。我甚至不能在保存过程中授权它,因为它在保存脚本中,会自动重定向回后期管理。

还有一件事要提:有一个重定向uri,我在管理页面的index.php上设置了它。不确定这是否是个问题,但不应该,因为新闻是在index.php?。。。。。。所以它仍然是同一页。

但这一切都能持续一个小时(或大约一个小时),所以我相信问题不在于重定向uri。THX

这是我的代码(它的副本粘贴自一些谷歌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
    }

总结一下:我希望我的授权工作时间更长,也许我的代码或我对其工作方式的理解有错误。

如果在请求授权时向用户请求"离线"访问,则获得长期访问权限的关键部分。

$client->setAccessType('offline');
$authUrl = $client->createAuthUrl();

这应该返回一个刷新令牌以及当前会话令牌。您必须保存此刷新令牌。即使他们稍后再次授权该应用程序,刷新令牌也不会再次发送。(注意,如果他们已经被授权,并且你在添加离线访问后让他们再次授权,有时你不会得到刷新令牌。)

然后你可以做如下检查,让他们登录:

$client->setAccessToken($site->token);
if($client->isAccessTokenExpired()) {
    $NewAccessToken = json_decode($client->getAccessToken());
    $client->refreshToken($NewAccessToken->refresh_token);
}

最后,我应该补充一点,您需要将accessToken保存到数据库中,而不仅仅是会话,以使其在不同的会话中持续存在。希望这已经很明显了。