Текущий метод получения нового токена доступа из обновления токена

Я вижу некоторые вопросы по этому поводу с решениями, которые, по-видимому, устарели в API-интерфейсе клиента Node.js API Google Node.js (например, это и это).

Я не вижу никакой документации относительно использования токена обновления для получения нового токена доступа ( раздел документации). В выпуске с начала 2017 года кто-то упоминает о выходе из oauth2Client.credentials свойство, но похоже, что оно находится в вызове одного из других API, упакованных в пакет.

В моем случае я запрашиваю API Google My Business (GMB), который там не включен, но я использую часть OAuth этого пакета для аутентификации и получения моих токенов.

Мой запрос к API GMB (используя request-promise модуль), выглядит примерно так:

function getLocations () {
  return request({
    method: 'POST',
    uri: `${gmbApiRoot}/accounts/${acct}/locations:batchGet`,
    headers: {
      Authorization: `OAuth ${gmbAccessToken}`
    }
  })
  .then(function (response) {
    console.log(response);
  })
  .catch(function (err) {
    // ...
  });
}

Я не думаю, что смогу передать oauth2Client в заголовки для авторизации, как в ответе на проблему. Есть ли способ напрямую запросить новый access_token учитывая, что мой токен обновления кэшируется в моем приложении?

Обновление: решено! Спасибо Джастину за помощь. Вот как выглядит мой рабочий код:

oauth2Client.setCredentials({
  refresh_token: storedRefreshToken
});

return oauth2Client.refreshAccessToken()
.then(function (res) {
  if (!res.tokens && !res.credentials) {
    throw Error('No access token returned.');
  }

  const tokens = res.tokens || res.credentials;

  // Runs my project-level function to store the tokens.
  return setTokens(tokens);
});

2 ответа

Решение

Если у вас есть клиент oauth2, все, что вам нужно сделать, это позвонить setCredentials:

oauth2client.setCredentials({
  refresh_token: 'REFRESH_TOKEN_YALL'
});

При следующем вызове, проходящем через клиента, он автоматически обнаружит, что токен доступа отсутствует, заметит токен обновления и поймает новый токен доступа вместе с датой его истечения. Я обрисовал некоторые документы и код по этому поводу в проблеме, которую вы открыли на GitHub: P

https://github.com/google/google-api-nodejs-client/pull/1160/files

Надеюсь это поможет!

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

А именно, я называл свои учетные данные так:

      oAuth2Client.setCredentials(JSON.parse(authResults));

мой authResults определяется следующим образом:

      const authResults = fs.readFileSync(TOKEN_PATH);

Это приводит к заполнению нескольких полей в переменной результатов:

      [
  'access_token',
  'refresh_token',
  'scope',
  'token_type',
  'expiry_date'
]

Теперь вот нюанс ... если access_token И refresh_token оба даны вызову setCredentials, токен обновления игнорируется. Переход к приведенному выше ответу, где я отправляю только токен обновления:

      oAuth2Client.setCredentials({ refresh_token: creds['refresh_token'] });

Работал как чемпион! Надеюсь, это найдет свой путь и поможет кому-то другому.

Другие вопросы по тегам