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 отдельным методом (в котором также используется один и тот же идентификатор клиента и секрет, и также устанавливает автономный метод). И чтобы получить авторизацию, я могу добраться до календарей. Это просто недолго …

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

Существует три типа кодов или токенов, возвращаемых сервером Autogtcation Googles.

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

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

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

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

Токен доступа

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

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

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

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