谷歌api授权很长一段时间

时间:2014-04-12 19:29:12

标签: php joomla google-api google-calendar-api

我正在尝试制作一些脚本,这会自动将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
    }

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

1 个答案:

答案 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保存到数据库而不仅仅是会话,以实际使其在不同的会话中保持不变。希望这已经很明显了。