Вопрос по php, google-api, access-token, oauth-2.0 – Google API Oauth PHP постоянный доступ

15

Я использую Google Calendar 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;

    }
@TerrySeidler Теоретически я знаю, что делать, или, по крайней мере, это то, что я понимаю до сих пор: когда истекает токен доступа, я предполагаю использовать токен обновления, чтобы получить новый, но большой вопрос заключается в том, как это сделать в практика. hope_industries
Круто - удачи;) Terry Seidler
Токен доступа истекает - этопочему вы получаете токен обновления? Вы должны иметь возможность получить новый токен доступа (и обновленный токен обновления), используя токен обновления, который вы получаете при аутентификации. (Я неХотя, к сожалению, для вас нет примеров кода Terry Seidler
(однако используйте токен обновления только в том случае, если срок действия исходного токена истек:stackoverflow.com/a/10186904/1313164) Terry Seidler

Ваш Ответ

3   ответа
0

чтобы использовать куки и сессии, вы должны сохранить его в базе данных и использовать его.

Аналогичная реализация для сайта drupal находится в песочнице Google OAuth2 по адресуhttp://drupal.org/sandbox/sadashiv/1857254 Этот модуль позволяет обрабатывать аутентификацию из интерфейса администратора drupal. Затем вы можете использовать полученный токен доступа из Google, а затем использовать функцию API google_oauth2_account_load или google_oauth2_client_get, чтобы получить Google_Client и выполнить ваш вызов API.

13

после ожидания в течение нескольких дней, предложение от Терри Сейдлера (комментарии ниже) сделало все это возможным! Вот мой кусок кода о том, как автоматически обновлять токен доступа, не проверяя каждый раз, используя куки.

(ВНИМАНИЕ: Этобезопаснее сохранить токен обновления в вашей базе данных)

Это магия (использование куки):

$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'));
    }

И это все! Если у вас есть какие-либо вопросы, не стесняйтесь оставлять комментарии ниже, и я отвечу как можно лучше. Удачи и Ура!

Будет ли это вызывать refreshToken каждый раз? Это плохо делать? Chris Muench
0

как отрасли надежды, но после тестирования я хотел обновить токен только тогда, когда мне было нужно. Полный исходный код просто поменяйте ключи и т.д. вверху:

require_once 'google-api-php-client/src/Google_Client.php';
require_once 'google-api-php-client/src/contrib/Google_CalendarService.php';
session_start();
$client = new Google_Client();
$client->setApplicationName("Google Calendar PHP Starter Application");
// Visit https://code.google.com/apis/console?api=calendar to generate your
// client id, client secret, and to register your redirect uri.
$client->setClientId('your_id');
$client->setClientSecret('your_secret');
$client->setRedirectUri("http://localhost/your_redirect.php");
$client->setDeveloperKey('your_key');

$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'] . $query_string);
}

if (isset($_SESSION['token'])) {
    $client->setAccessToken($_SESSION['token']);//update 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
    if (isset($sessionToken->refresh_token)) { //refresh token is only set after a proper authorisation
        $number_of_days = 30 ;
        $date_of_expiry = time() + 60 * 60 * 24 * $number_of_days ;
        setcookie('token', $sessionToken->refresh_token, $date_of_expiry);
    }
}
else if (isset($_COOKIE["token"])) {//if we don't have a session we will grab it from the cookie
    $client->refreshToken($_COOKIE["token"]);//update token
}

if ($client->getAccessToken()) {
    $calList = $cal->calendarList->listCalendarList();
    print "<h1>Calendar List</h1><pre>" . print_r($calList, true) . "</pre>";
    $_SESSION['token'] = $client->getAccessToken();
} else {
    $authUrl = $client->createAuthUrl();
    print "<a class="login" href="$authUrl">Select a calendar!</a>";
}

Похожие вопросы