0

Я хочу только один раз обратиться к пользователю, чтобы получить доступ к учетной записи. У меня есть токен, но после 3600 секунд токен истекает.Запросить разрешение использовать только первый раз, чтобы использовать календарь

Это мой код (рабочий) «внутри» рамки. Кто-то может сказать, как я могу это сделать?

public function actionEvent() { 
    $client = new Google_Client(); 
    $client->setApplicationName("Google Calendar Event"); 
    $client->setAuthConfig(Yii::getAlias('@webroot') . '/calendar/client_secret.json'); 
    $client->addScope(\Google_Service_Calendar::CALENDAR); 
    $client->setAccessType('offline'); 
    if (isset($_SESSION['access_token']) && $_SESSION['access_token']) { 
     $client->setAccessToken($_SESSION['access_token']); 
     $calendar_service = new \Google_Service_Calendar($client); 
     $event = new Google_Service_Calendar_Event(array(
       ..events here.. 
     )); 
     $calendarId = 'primary'; 
     $event = $calendar_service->events->insert($calendarId, $event); 
     var_dump($event->htmlLink); 
    } else { 
     $redirect_uri = $this->redirect(['pop/callback']); 
    } 
} 

public function actionCallback() { 
    $client = new Google_Client(); 
    $client->setApplicationName("Google Calendar Event"); 
    $client->setAuthConfigFile(Yii::getAlias('@webroot') . '/calendar/client_secret.json'); 
    $client->setRedirectUri('http://localhost/pop/callback'); 
    $client->addScope(\Google_Service_Calendar::CALENDAR); 
    if (!isset($_GET['code'])) { 
     $auth_url = $client->createAuthUrl(); 
     $this->redirect($auth_url); 
    } else { 
     $client->authenticate($_GET['code']); 
     $_SESSION['access_token'] = $client->getAccessToken(); 
     $this->redirect(['pop/event']); 
    } 
} 

Внутри сессии у меня есть:

array (size=3) 
    '__flash' => 
    array (size=0) 
     empty 
    '__id' => int 1 
    'access_token' => 
    array (size=4) 
     'access_token' => string 'ya29.Ci-sf-asdfsadfsdfsd' (length=71) 
     'token_type' => string 'Bearer' (length=6) 
     'expires_in' => int 3599 
     'created' => int 1479326378 

Спасибо

+0

В основном такой же вопрос, как и у вашего другого сегодня? http://stackoverflow.com/questions/40625179/add-event-to-google-calendar-using-api –

+0

Да, но теперь с кодом. –

+0

вы можете обновить токен –

ответ

1

Самый первый раз, когда ваше приложение аутентификации пользователя, вы возвращаетесь освежать маркер внутри $_SESSION['access_token'] = $client->getAccessToken();. То есть, когда вам нужно получить токен обновления $refrshToken = $_SESSION['access_token']['refresh_token];, чтобы вы могли использовать его через 3600 секунд, чтобы обновить токен доступа. Если вы не сохраните обновления токенов первый раз, когда ваше приложение проверки подлинности, то вы должны установить запрос утверждения в силу$client->setApprovalPrompt('force');, или в качестве альтернативы вы можете удалить приложение из ваших подключенных приложений и сайтов https://security.google.com/settings/security/permissions?utm_source=OGB

Вы можете попробовать модифицируя функцию actionCallback как этот

public function actionCallback() { 

    $client = new Google_Client(); 
    $client->setApplicationName("Google Calendar Event"); 
    $client->setAuthConfigFile(Yii::getAlias('@webroot') . '/calendar/client_secret.json'); 
    $client->setRedirectUri('http://localhost/pop/callback'); 
    $client->addScope(\Google_Service_Calendar::CALENDAR); 

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

     $client->setApprovalPrompt('force'); 
     $auth_url = $client->createAuthUrl(); 
     $this->redirect($auth_url); 

    } else { 

     $client->authenticate($_GET['code']); 
     $_SESSION['access_token'] = $client->getAccessToken(); 

     //Save refresh token to cookie 
     setcookie("autorefresh", $_SESSION['access_token']['refresh_token], 2000000000); 

     $this->redirect(['pop/event']); 

    } 
} 

А затем попробуйте изменить вашу функцию ActionEvent как этот

public function actionEvent() { 

    $client = new Google_Client(); 
    $client->setApplicationName("Google Calendar Event"); 
    $client->setAuthConfig(Yii::getAlias('@webroot') . '/calendar/client_secret.json'); 
    $client->setAccessType('offline'); 
    $client->addScope(\Google_Service_Calendar::CALENDAR); 

    if (isset($_COOKIE['autorefresh'])){ 

     if (!isset($_SESSION['access_token'])) { 
      $_SESSION['access_token'] = $client->getAccessToken(); 
     } 

     if(time() - $_SESSION['access_token']['created'] >= 3600){ 

      $refreshtoken = $_COOKIE['autorefresh'];   

      $client->refreshToken($refreshtoken); 
      $_SESSION['access_token'] = $client->getAccessToken(); 
     } 

     $calendar_service = new \Google_Service_Calendar($client); 
     $event = new Google_Service_Calendar_Event(array(
      ..events here.. 
     )); 
     $calendarId = 'primary'; 
     $event = $calendar_service->events->insert($calendarId, $event); 
     var_dump($event->htmlLink); 
    } else { 
     actionCallback(); 
    } 
} 

Just мольба SE BARE IN MIND, СОДЕРЖАЩАЯ РЕЗЕРВУАРЫ TOKEN TO COOKIE, НЕ РЕКОМЕНДУЕТСЯ! Это только потому, что вы можете проверить, как работает система токенов обновления. Я настоятельно рекомендую вам сохранить его в файле или в базе данных sql. Надеюсь, это поможет!

+0

Спасибо, Морфинизм. Я решил свою проблему по-другому. Я сохраняю данные в базе данных. Мне нужна была слишком чистая вся переменная сессии, чтобы получить refresh_token. (Снята с охраны ($ _ SESSSION);). –

+0

У меня есть еще один вопрос. Каждый раз, когда я хочу получить доступ к webapp с другого устройства, мне нужно принять? (с использованием той же учетной записи и той же учетной записи gmail, только смены устройства/браузера) –

+1

Если вы сохраняете информацию о доступе в базе данных, этого не должно произойти. Вам будет предложено принять, если у вас нет кода доступа для запроса токена обновления. – Morfinismo

Смежные вопросы