Google API Oauth php 永久访问权限

2022-08-31 01:11:35

我正在使用谷歌日历API。这就是我想要的,一旦你给了应用程序权限,我可以随时使用应用程序,而不需要每天提供访问权限。我一直听说我需要保存访问令牌或使用刷新令牌来执行我想执行的操作。事情是这样的,你是怎么做到的?代码是什么样的?我尝试将令牌保存在 Cookie 中,但一小时后,访问令牌已过期。如何使用户保持登录状态?

PS:请给我代码示例和解释。

这是我的代码(使用CakePHP):

$client = new Google_Client();

    $client->setApplicationName("Wanda3.0 Agenda");

    $cal = new Google_CalendarService($client);

    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()) {
        /************* Code entry *************/


    }else{
        /************* Not connected to google calendar code *************/
        $authUrl = $client->createAuthUrl();

        $returnArr = array('status' => 'false', 'message' => "<a class='login' href='$authUrl'>Connect Me!</a>");

        return $returnArr;

    }

答案 1

好吧,在等待了几天之后,Terry Seidler的建议(下面的评论)使这一切发生了!下面是我的一段代码,介绍如何自动刷新访问令牌,而无需每次使用 Cookie 进行初始化。

(注意:将刷新令牌保存在数据库中更安全)

这是魔术(使用饼干):

$client = new Google_Client();

    $client->setApplicationName("Wanda3.0 Agenda");

    $cal = new Google_CalendarService($client);

    $client->setAccessType('offline');

    if (isset($_GET['code'])) {

        $client->authenticate($_GET['code']);

        $_SESSION['token'] = $client->getAccessToken();

        header('Location: http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']);

    }

    //Where the magic happends
    if (isset($_SESSION['token'])) {

        //Set the new access token after authentication
        $client->setAccessToken($_SESSION['token']);

        //json decode the session token and save it in a variable as object
        $sessionToken = json_decode($_SESSION['token']);

        //Save the refresh token (object->refresh_token) into a cookie called 'token' and make last for 1 month
        $this->Cookie->write('token', $sessionToken->refresh_token, false, '1 month');
    }

    //Each time you need the access token, check if there is something saved in the cookie.
    //If $cookie is empty, you are requested to get a new acces and refresh token by authenticating.
    //If $cookie is not empty, you will tell the client to refresh the token for further use,
    // hence get a new acces token with the help of the refresh token without authenticating..
    $cookie = $this->Cookie->read('token');

    if(!empty($cookie)){
        $client->refreshToken($this->Cookie->read('token'));
    }

就是这样!如果您有任何疑问,请随时在下面发表评论,我将尽力回答。祝你好运,干杯!


答案 2

您不应使用 Cookie 和会话,而应将其保存在数据库中并使用它。

drupal站点的类似实现位于google OAuth2沙箱 http://drupal.org/sandbox/sadashiv/1857254 此模块允许您处理来自drupal管理界面的身份验证。然后,您可以使用从Google获取的访问令牌,然后使用google_oauth2_account_load或google_oauth2_client_get的api函数来获取Google_Client并执行您的api调用。


推荐