Обновить токен oauth2 google api и HWIOAuthBundle

Как я могу обновить токен? Я использую Google API с этим токеном - он работает, но не могу найти, как его обновить, в этом примере мы не сохраняем истекшее время. Я требую

`access_type:     offline `

потом

$client = new Google_Client();
        //$client->setClientId($GoogleClientId);
        $client->setApplicationName($GoogleAppName);
        $client->setClientId($this->user->getGoogleId());
        $client->setAccessType('offline');

если токен действителен, я могу работать, но когда срок его действия истек, я пытаюсь

$token = [
            'access_token' => $this->user->getGoogleAccessToken(),
            'expires_in'   => (new \DateTime())->modify('-1 year')->getTimestamp(),
        ];

я ставлю любую дату, потому что в этом примере мы не сохраняем истекшее время

https://gist.github.com/danvbe/4476697

    $client->setAccessToken($token);

    if($client->isAccessTokenExpired()){

        $refreshedToken = $client->refreshToken($client->getAccessToken());

вот у меня ошибка

array:2 [▼
  "error" => "invalid_request"
  "error_description" => "Could not determine client ID from request."
]

Существует метод HwiAuthBundle для обновления токена? Почему это не работает с обновлением Google_Client?


person Developer    schedule 10.11.2016    source источник
comment
что такое getGoogleId? Идентификатор клиента — это идентификатор клиента из консоли разработчика Google, который использовался для создания токена обновления, который вы используете.   -  person DaImTo    schedule 10.11.2016
comment
Если вы еще не видели эту ветку, похоже, они считают обновление токенов более низким приоритетом для этого пакета: github.com/hwi/HWIOAuthBundle/issues/457 Таким образом, это не готовое решение "включай и работай".   -  person Cameron Hurd    schedule 11.11.2016


Ответы (2)


В oauth2.0 для обновления токена доступа с истекшим сроком действия необходимо отправить в конечную точку:

  • тип гранта равен 'refresh_token'
  • действительный маркер обновления
  • ваш идентификатор клиента
  • и ваш clientSecret

Вы не можете отправить accessToken с истекшим сроком действия, чтобы получить новый обновленный accessToken.

public function refreshAccessToken($refreshToken, array $extraParameters = array())
{
    $parameters = array_merge(array(
        'refresh_token' => $refreshToken,
        'grant_type' => 'refresh_token',
        'client_id' => $this->options['client_id'],
        'client_secret' => $this->options['client_secret'],
    ), $extraParameters);
    $response = $this->doGetTokenRequest($this->options['access_token_url'], $parameters);
    $response = $this->getResponseContent($response);
    $this->validateResponseContent($response);
    return $response;
}

функция refreshAccessToken($refreshToken, ...

а не $accessToken

Я думаю, вам нужно позвонить после создания вашего клиента с вашими учетными данными

$client = new Google_Client();
$client->setAuthConfig('client_secrets.json');
$client->refreshToken($client->getRefreshToken());

https://developers.google.com/api-client-library/php/auth/web-app#creatingcred

Вы уверены в своем $client->setClientId($this->user->getGoogleId()); ? Что такое getGoogleId()? Я думаю, вам также нужно создать идентификатор клиента oauth: https://developers.google.com/identity/sign-in/web/devconsole-project

В oauth client_id — это не идентификатор пользователя, а идентификатор приложения

person François LEPORCQ    schedule 20.09.2017
comment
В комплекте уже есть метод обновления токена: GenericOAuth2ResourceOwner::refreshToken(), но нет документации, как реализовать его в рабочем процессе, как описано здесь - person Stephan Vierkant; 20.09.2017
comment
да, но ясно, что вы должны передать refreshToken, а не accessToken в первом параметре метода refreshAccessToken. В oauth 2.0, чтобы обновить токен доступа, вам нужно отправить действительный токен обновления, а Grant_type равен «refresh_token», а также ваш идентификатор и секрет клиента. - person François LEPORCQ; 20.09.2017
comment
Можешь отметить мой ответ? я делаю небольшой конкурс с моими коллегами, мне нужно несколько очков. Спасибо ! - person François LEPORCQ; 26.09.2017

Извините, что расстроил вас, amigo, но похоже, что этот пакет не реализует никаких функций Refresh Token. Или это остается на ваше усмотрение.

Вот открытая проблема в их GitHub, посмотрите: https://github.com/hwi/HWIOAuthBundle/issues/457

Вот комментарий из выпуска:

Эта функция существует, но использовать ее нелегко, так как вам нужно делать все самостоятельно (сохранение более подробной информации о токене, определение истечения срока действия, вызов Google для получения нового токена и замена старого), только помощь от этого пакет на данный момент, это код, который позволяет запросить у Google новый свежий токен: GenericOAuth2ResourceOwner::refreshToken(), он должен работать как положено, но я давно не использовал этот пакет =)

Люди там ждут Gist (фрагмент кода), чтобы показать им, как это сделать, но пока ничего.

person delboy1978uk    schedule 19.09.2017
comment
Не совсем верно. В нем есть метод для обновить токен, но не задокументировано, как его использовать. Я прошу хороший пример в дополнение к документации. - person Stephan Vierkant; 19.09.2017
comment
Ваш ответ не отвечает на вопрос. Вы заявляете, что пакет не реализует токены обновления, но это так. Однако это не задокументировано, и именно поэтому этот вопрос возник в первую очередь. - person Stephan Vierkant; 19.09.2017