Текущий метод получения нового токена доступа из обновления токена
Я вижу некоторые вопросы по этому поводу с решениями, которые, по-видимому, устарели в 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'] });
Работал как чемпион! Надеюсь, это найдет свой путь и поможет кому-то другому.