Я сталкиваюсь с каким-то странным поведением при попытке использовать OAuth для локального скрипта Node.js.Сейчас моя цель - получить токен обновления у пользователя, когда он авторизует мой проект.
Я стараюсь изо всех сил полагаться на библиотеки Google, но у меня все еще есть проблемы с ним.
Когда я пытаюсь запустить установку, я правильно получаю страницу OAuth и создаю токен авторизации:
const { google } = require('googleapis');
const oauth2Client = new google.auth.OAuth2(
clientId,
clientSecret,
'urn:ietf:wg:oauth:2.0:oob'
);
const scopes = [
'https://www.googleapis.com/auth/calendar'
];
Я предоставляю пользователю URL в консоли:
const url = oauth2Client.generateAuthUrl({
// 'online' (default) or 'offline' (gets refresh_token)
access_type: 'offline',
// If you only need one scope you can pass it as a string
scope: scopes
});
console.log(url);
Затем я открываю URL и генерирую токен.Я предлагаю пользователю ввести это значение:
stdio.question('Authorization code', (err, code) => {
// Use this code to obtain a refresh token
console.log("CODE", code);
oauth2Client.getToken(code, (err, tokens) => {
console.log(err, tokens);
});
});
Когда я дохожу до этой точки, я сталкиваюсь с ошибкой:
error: 'invalid_grant', error_description: 'Bad Request'
И неясно, где это идет не так.
Если я возьму тот же токен аутентификации и использую cURL, он на самом деле работает, как и ожидалось, поэтому, насколько я могу судить, это не ошибка конфигурации.
curl -s -X POST -d 'code='$CODE'&client_id='$CLIENT_ID'&client_secret='$CLIENT_SECRET'&redirect_uri=urn:ietf:wg:oauth:2.0:oob&grant_type=authorization_code' https://www.googleapis.com/oauth2/v4/token
{
"access_token": "ACCESS",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "REFRESH"
}
Что еще интереснее, так эточто если я прогоню поток и получу ошибку, попытка выполнить команду cURL вернет ошибку, которая указывает на то, что запрос был принят в некоторой степени:
{
"error": "invalid_grant",
"error_description": "Code was already redeemed."
}
Что происходит в этой библиотеке OAuth, котораявызывая проблему недопустимого предоставления, которая не происходит с cURL, и что я могу сделать, чтобы исправить код Node.js?