Обмен OAuth дает недействительные_границы и неверный запрос - PullRequest
0 голосов
/ 06 июня 2018

Я сталкиваюсь с каким-то странным поведением при попытке использовать 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?

1 Ответ

0 голосов
/ 07 июня 2018

Оказывается, проблема с библиотекой stdio заключается в том, что весь вводимый вами текст в конечном итоге преобразуется в нижний регистр , прежде чем вы получите его в обратном вызове.Это то, что привело к ошибке invalid_grant.

Лучший способ - использовать встроенный модуль readline в Node.js

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

rl.question('Authorization code: ', (code) => {
  // Use this code to obtain a refresh token
  console.log("CODE", code);
  oauth2Client.getToken(code, (err, tokens) => {
    console.log(err, tokens);
    rl.close();
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...