Подтвердить что ты не робот

Google API PHP офлайн-доступ, "invalid_grant: код уже был выкуплен"

Как разрешить Google Client навсегда, пока пользователь не аннулирует авторизацию?

Я пытаюсь создать приложение, которое подключается к Календарю Google. Он должен работать на PHP, поэтому я использую клиент PHP API Google, предоставляемый google.

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

Я создал учетные данные в Google Консоли, используя метод службы (с идентификатором клиента и секретом клиента). Используя клиент Google API, я также запросил авторизацию у пользователя. Я открываю новое окно браузера, пользователь авторизуется, код авторизации возвращается Google. Я беру этот код, сохраняю его и использую для авторизации клиента, который успешно подключается к Календарю Google и обменивается данными.

Теперь я понял, что это токен, который истекает. Если не использовать автономный доступ, который я установил. Однако через несколько минут или меньше я всегда получаю сообщение об ошибке: Error fetching OAuth2 access token, message: 'invalid_grant: Code was already redeemed.

Это код, который я использую для подключения клиента:

$client = new \Google_Client();
$client->setApplicationName( 'My App' );
$client->setScopes( array( \Google_Service_Calendar::CALENDAR ) );
$client->setClientId( $this->google_client_id );
$client->setClientSecret( $this->google_client_secret );
$client->setRedirectUri( $this->google_client_redirect );
$client->setAccessType( 'offline' );

if ( $code = $this->google_client_auth ) {

    try {

        $client->authenticate( $code );

    } catch( \Exception $e ) {
            var_dump( $e );
    }    

}

return new \Google_Service_Calendar( $client );

Это метод внутри класса.

Идентификатор клиента и секрет клиента хранятся в настройках приложения.

Я также сохраняю код, возвращенный пользователем в настройке, но я думаю, что это именно то, где я делаю это неправильно? Я помещаю ссылку в окно Google OAuth отдельным методом (который также использует один и тот же идентификатор клиента и секрет и также устанавливает автономный метод). И чтобы получить авторизацию, я могу добраться до календарей. Это просто недолго...

4b9b3361

Ответ 1

Существует три типа кодов или токенов. Сервер аутентификации Googles возвращается.

  • Код аутентификации
  • Ток доступа
  • Обновить токен.

Код аутентификации

Когда пользователь нажимает на форму Authentcation и предоставляет доступ к вашему приложению. Google возвращает вам код Authentcation. Вы должны взять этот код и обменять его на токен доступа и токен обновления. Этот код используется только один раз, если вы попытаетесь использовать его снова, вы получите сообщение об ошибке.

invalid_grant: Код уже был выкуплен.

Маркер доступа

Агенты доступа используются для доступа к API, этот токен должен быть отправлен вместе с каждым запросом. Токены доступа недолговечны, они работают в течение часа, а затем перестают работать.

Обновить токен

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

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