ошибка invalid_grant при попытке обновить маркер доступа для googleapis

#node.js #oauth #google-api #google-oauth #google-api-nodejs-client

Вопрос:

Мы используем googleapi для нашего веб-приложения, а также храним и управляем токеном доступа и токеном обновления в нашей базе данных. Когда мы обновляем маркер доступа пользователей с помощью маркера обновления, редко у нас была ошибка GaxiosError: invalid_grant.

Теперь мы используем клиент Google api nodejs[ https://github.com/googleapis/google-api-nodejs-client ]. Мы храним маркер доступа и маркер обновления в нашей базе данных для каждого пользователя, и они обновляются по приведенной ниже логике за 6 часов.

 import { google } from 'googleapis';

// create oauth2client for google apis
const oAuth2Client = new google.auth.OAuth2(client_secret, client_id, redirect_uri);

// set current access token and refresh token (==current_tokens)
oAuth2Client.setCredentials(current_tokens);

// refresh access token and refresh token
// new_token contains access_token and refresh_token
const new_token = await oAuth2Client.refreshAccessToken();

// store the new access token and new refresh token to database
...

 

Кто-нибудь знает, что может быть причиной ошибки GaxiosError: invalid_grant?
У меня такое чувство, что это может быть связано с тем, что токен обновления обновляется каждые 6 часов.

Дополнительная информация

настройка создания URL-адреса аутентификации

 const authUrl = oAuth2Client.generateAuthUrl({
        access_type: 'offline',
        scope: GOOGLE_APIS_SCOPE, // GOOGLE_APIS_SCOPE contains scopes
        prompt: 'consent',
      });
 

Ответ №1:

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

  • Пользователь отозвал доступ к вашему приложению.
  • Токен обновления не использовался в течение шести месяцев.
  • Пользователь изменил пароли, и маркер обновления содержит области действия Gmail.
  • Учетная запись пользователя превысила максимальное количество предоставленных (активных) токенов обновления.
  • Пользователь принадлежит к организации облачной платформы Google, в которой действуют политики управления сеансами.
  • Проекту облачной платформы Google с экраном согласия OAuth, настроенным для внешнего типа пользователя, и статусом публикации «Тестирование» выдается токен обновления, срок действия которого истекает через 7 дней.

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

Вы упомянули, что он хранится в базе данных каждые шесть часов. Я бы дважды проверил, обновляете ли вы токен доступа каждые шесть часов и возвращает ли он новый токен обновления каждый раз, когда вы фактически обновляете базу данных самым последним токеном обновления, в противном случае вы можете достичь «максимального количества предоставленных (живых) токенов обновления».

Комментарии:

1. Спасибо вам за ваш ответ! Приложение уже находится в производстве. Мы обновляем токен доступа и сохраняем его в базе данных каждые 6 часов с помощью функции oAuth2Client.refreshAccessToken. Также я подтвердил, что программа использует последний токен доступа и обновления при каждом обновлении.

2. В принципе, продолжаем ли мы использовать один и тот же токен обновления в googleapis для пользователя? Другими словами, нужно ли нам обновлять токен обновления?

3. По моему мнению, это зависит от клиентской библиотеки, которую мы используем, получаете ли вы новый токен обновления при каждом запросе или он просто продолжает использовать тот же самый. Я знаю, что клиентская библиотека PHP имеет привычку предоставлять вам одну и ту же, в то время как клиентская библиотека .net, как правило, каждый раз получает новую. Это означает, что я бы обновил токен обновления на случай, если он не совпадает с тем, который вы сейчас сохранили.