2013-12-13 2 views
15

У меня есть веб-приложение, в котором Google OAuth2.0 используется как платформа входа. Он работает до вчерашнего дня. При истечении токена доступа аппликация не смогла получить токен обновления. Кроме того, на странице «Запрос на разрешение» были внесены изменения в «Использовать автономный доступ» вместо «Знать, кто вы в Google» и «Просмотреть адрес электронной почты»Идентификатор доступа OAuth 2.0 истек, а токен обновления не доступен

Первоначально страница «Запрос на разрешение» запрашивала доступ к «Знайте, кто вы в Google» и «Просмотреть электронную почту». После выхода из системы и повторного входа в систему, страница «Запрос на разрешение» будет одинаковой.

Однако до вчерашнего дня страница «Запрос на разрешение» была изменена на «Доступ к автономному доступу». После того, как токен доступа истек, я получил сообщение об ошибке ниже:

PHP Неустранимая ошибка: исключить исключение «Google_AuthException» с сообщением «Ток доступа к OAuth 2.0 истек, а токен обновления недоступен. Обновленные токены не возвращаются для ответов, которые были автоматически одобрены. ' в /home2/xxxx/public_html/test/google-api-php-client/src/auth/Google_OAuth2.php:221

Я пробовал $client->setAccessType('online');. Тем не менее, я до сих пор получил эту фатальную ошибку со мной. Ниже мой код, чтобы получить маркер доступа:

if ($client->getAccessToken()) { 
     $token = $client->getAccessToken(); 
     $authObj = json_decode($token); 
     $refreshToken = $authObj->refresh_token; 
     $user = $oauth2->userinfo->get(); 
     $me = $plus->people->get('me'); 
     $email = filter_var($user['email'], FILTER_SANITIZE_EMAIL); // get the USER EMAIL ADDRESS using OAuth2 

     $optParams = array('maxResults' => 100); 
     $activities = $plus->activities->listActivities('me', 'public', $optParams); 


     $_SESSION['access_token'] = $client->getAccessToken(); 
    } else { 
     $authUrl = $client->createAuthUrl(); 
    } 

Я пытался искать похожие проблемы, как я, но я не мог найти. Это произошло со вчерашнего дня. До этого я никогда не делал никаких изменений в кодах.

+0

Насколько я знаю, они немного изменили управление безопасностью. Если теперь вы предоставляете доступ к приложению, Google знает в будущем, какие разрешения вы запрашивали и сохраняете, и вас снова спрашивают, если вы хотите иметь новые разрешения или автономный доступ. Я думаю, это была временная ошибка, пока они обновляли свою систему, потому что сейчас я не испытываю никаких проблем. –

+0

Обновление: вы правы, я также не могу использовать токены обновления ... –

+0

Можете ли вы рассказать мне, как избавиться от этого? – Akilsree1

ответ

18

С его комментариями, Fabian Parzefall помог мне исправить это.

Вот мой сценарий:

if($client->isAccessTokenExpired()) { 

    $authUrl = $client->createAuthUrl(); 
    header('Location: ' . filter_var($authUrl, FILTER_SANITIZE_URL)); 

} 

Это на самом деле довольно просто. Вместо того, чтобы просить его нажать кнопку «соединить меня» (как показано демо-скриптом, предоставленным командой API GA), я перенаправляю его напрямую. Не уверен, что это правильный/безопасный способ, но это тот, который работает на меня прямо сейчас!

+0

Можете ли вы объяснить, как это решение заставило API одобрить ваш токен доступа? – Rodniko

+0

Этот фрагмент кода на самом деле не о получении вашего токена доступа, а просто для того, чтобы пользователь не мог войти в приложение каждые 5 миллионов. И, извините, я не дотронулся до этого кода с давних времен, поэтому я не смогу помочь прямо сейчас ... –

3
if($client->isAccessTokenExpired()) { 

    $client->authenticate(); 
    $NewAccessToken = json_decode($client->getAccessToken()); 
    $client->refreshToken($NewAccessToken->refresh_token); 

    } 
+3

authenticate() требует, чтобы код возвращался из системы аутентификации. –

+0

Я получил это, чтобы работать, но, похоже, бесконечный цикл, так как токен продолжает истекать при загрузке страницы. – JBS

2

Ответ выше «правильным», но я faffed вокруг разработки, где поставить его (!) ... так что этот пост для любого другого пытающегося из примеров, которые в конечном итоге с лексемы истекающий (!).

После того, как ваш код выполнил все необходимые токены, и ваш клиент имеет токен доступа ... тогда проверьте, что он все еще действителен и если он не отправляется на повторную авторизацию!

// Stuff to do with getting tokens and storing in session etc... 

if ($client->getAccessToken()) { // Hey! we got one! 
    if($client->isAccessTokenExpired()) { // Oh! its not good - go for another 
     $authUrl = $client->createAuthUrl(); 
     header('Location: ' . filter_var($authUrl, FILTER_SANITIZE_URL)); 
     exit(); 
    } 
    try{ 
... 
    } 
+0

Мне пришлось отключить всю мою СЕССИЮ, которая сохранила и передала токен и состояние при перенаправлении, но я не понимаю, почему я не мог просто отключить сохраненный токен. Я подозреваю, что государство используется вместе с токеном, но я не мог исследовать его и должен был двигаться дальше. – imparante

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