Запрос NodeJS Post с обещанием запроса для аутентификации Twitch - PullRequest
0 голосов
/ 13 октября 2018

Я пытаюсь аутентифицировать пользователя в моем приложении через его вход в Twitch.Я не могу получить request.post() правильно (используя запрос-обещание).Я пробовал много разных вариантов, и я обычно получаю «необработанное отклонение» в журналах сервера.Руководство по Twitch API для этого здесь .Ответ POST должен быть JSON.Вот моя последняя версия:

const twitchATParams =
'?client_id=' + twitchAppClientId +
'&client_secret=' + twitchClientSecret +
'&code=' + code +
'&grant_type=authorization_code' +
'&redirect_uri=' + twitchAppRedirect;

request.post(twitchATRequestUrl + twitchATParams)
.then((accessTokenResponse) => {
    const accessToken = accessTokenResponse.access_token;
    console.log('Got an access token: ' + accessToken);
    res.status(200).send('Got an access token: ' + accessToken);
  })
  .catch((error) => {
    res.status(error.statusCode).send(error.error.error_description);
  });

Я также попробовал это:

request.post({
url:     twitchATRequestUrl,
form:    { client_id: twitchAppClientId,
           client_secret: twitchClientSecret,
           code: code,
           grant_type: "authorization_code",
           redirect_uri:  twitchAppRedirect}
}, function(error, accessTokenResponse, body){
  const accessToken = accessTokenResponse.access_token;
  console.log('Got an access token: ' + accessToken);
  res.status(200).send('Got an access token: ' + accessToken);
});

Это то, что руководство по Twitch API говорит, что мне нужно сделать, я думаю, что у меняпроблема с переводом этого на JavaScript:

POST https://id.twitch.tv/oauth2/token
  ?client_id=<your client ID>
  &client_secret=<your client secret>
  &code=<authorization code received above>
  &grant_type=authorization_code
  &redirect_uri=<your registered redirect URI>

ОБНОВЛЕНИЕ: приложение размещено на Firebase с использованием облачных функций.Может быть, это влияет на мой запрос?

ОБНОВЛЕНИЕ 2: В соответствии с этим: Развернутая функция Firebase не может выполнить HTTP GET для внешнего API? Я могу делать внешние запросы API только для платного плана Firebase.Я предполагаю, что это моя проблема.Я перейду на план с оплатой по факту (который на самом деле предоставляет много данных бесплатно), попробую это снова и опубликую свои результаты здесь.

Ответы [ 3 ]

0 голосов
/ 13 октября 2018

Я думаю, что вы использовали запрос-обещание неправильно.Попробуйте вместо этого.

var rp = require('request-promise');

Внутренняя функция API:

const twitchATParams =
'?client_id=' + twitchAppClientId +
'&client_secret=' + twitchClientSecret +
'&code=' + code +
'&grant_type=authorization_code' +
'&redirect_uri=' + twitchAppRedirect;


var options = {
    method: 'POST',
    uri: twitchATRequestUrl + twitchATParams,
    /* qs: {
        access_token: 'xxxxx xxxxx' // -> uri + '?access_token=xxxxx%20xxxxx'
    }, */ //you can pass params here too
    json: true // Automatically stringifies the body to JSON
};

rp(options)
    .then(function (response) {
        res.status(200).send('Got an access token: ' + response.accessToken);
    })
    .catch(function (err) {
        // Post failed...
    });
0 голосов
/ 15 октября 2018

решаемая.Оказывается, мне нужен платный план (Blaze, плати как угодно) для доступа к внешним API.Я обновился, и это в основном решило проблему.Это позволило мне увидеть новый код ошибки: StatusCodeError: 400 - "{\"status\":400,\"message\":\"Parameter redirect_uri does not match registered URI\"}, поэтому я обнаружил, что в моем коде перенаправления отсутствует код «/ callback» (URL-адрес перенаправления OAuth в настройках управления приложением Twitch содержал этот «/ callback» в конце).

Я также смог использовать эти два блока кода для успешного получения токена доступа:

const twitchTokenPayload = {
  client_id: twitchAppClientId,
  client_secret: twitchClientSecret,
  code: code,
  grant_type: 'authorization_code',
  redirect_uri: twitchAppRedirect,
};

request.post(twitchATRequestUrl, { json: twitchTokenPayload })
  .then((accessTokenResponse) => {
    const accessToken = accessTokenResponse.access_token;
    console.log('Got an access token: ' + accessToken);
    res.status(200).send('Got an access token: ' + accessToken);
  })
  .catch((error) => {
    console.log('Caught error: ' + error.error.error_description);
    res.status(error.statusCode).send(error.error.error_description);
  });

И это также сработало:

request.post({
url:     twitchATRequestUrl,
form:    { client_id: twitchAppClientId,
           client_secret: twitchClientSecret,
           code: code,
           grant_type: "authorization_code",
           redirect_uri:  twitchAppRedirect}
}, function(error, response, body){
  console.log(JSON.parse(body));
  const jsonStuff = JSON.parse(body);
  const accessToken = jsonStuff.access_token;
  console.log('Got an access token: ' + accessToken);
  res.status(200).send('Got an access token: ' + accessToken);
});
0 голосов
/ 13 октября 2018

Я не знаю, какую библиотеку вы используете, но последний пример очень похож с этой версией: https://www.npmjs.com/package/request.

Если это та версия, проблема в том, что вы неправильно отображаете параметры вашегоПерезвоните.AccessTokenResponse var - это объект ответа, а не ваш JSON, который вы хотите.Вы должны разобрать параметры тела следующим образом.

function(error, response, body){
    console.log(JSON.parse(body));
}
...