Невозможно обменять код для токена доступа в node.js. Mailchimp API - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь использовать OAuth2 с API Mailchimp и следую их документации к письму, но не могу выполнить шаг 4. На этом шаге я обмениваю код, полученный на экране авторизации, на токен , Согласно документации, это можно сделать в curl следующим образом:

curl --request POST \
--url 'https://login.mailchimp.com/oauth2/token' \
--data "grant_type=authorization_code&client_id={client_id}&client_secret={client_secret}&redirect_uri={encoded_url}&code={code}" \
--include

Я попытался преобразовать это для работы на node.js, написав это:

        var dataString = 'grant_type=authorization_code&client_id=' + clientid + '&client_secret=' + clientsecret + '&redirect_uri=' + encodedurl + '&code=' + url.parse(req.url, true).query.code;

        var options = {
            url: 'https://login.mailchimp.com/oauth2/token',
            method: 'POST',
            data: dataString
        };

        function callback(error, response, body) {
            if (!error) {
                console.dir(JSON.stringify(body));
            }
            else{
                console.dir(error); 
            }
        }

        request(options, callback);

Когда я делаю request.debug = true, я вижу, что получаю ошибку 400. Сообщение, отправленное на консоль, представляет собой набор искаженных символов. Когда я использую эти же переменные и конечные точки для аутентификации через Postman, все работает нормально, поэтому проблема не в переменных или самом API.

Я не совсем уверен, что я здесь делаю неправильно. Запрос, который я делаю, кажется почти идентичным написанному в документации. Так, где я иду не так?

Ответы [ 3 ]

0 голосов
/ 04 мая 2018

Наконец-то разобрался. Вопрос был в шапке запроса. Есть два способа это исправить. Первое - использовать «форму» вместо «данные». Запрос автоматически включает заголовок «content-type: x-www-form-urlencoded», если используется опция «form».

var options = {
    url: 'https://login.mailchimp.com/oauth2/token',
    method: 'POST',
    form: dataString
};

Я не уверен, какой заголовок используется, когда используется опция «data», или если тип содержимого вообще не объявлен. В любом случае, если вы решите продолжать использовать опцию «data», вы можете вручную объявить заголовок типа контента. Это второе возможное решение.

var options = {
    url: 'https://login.mailchimp.com/oauth2/token',
    method: 'POST',
    headers: 
    { 'Content-Type': 'application/x-www-form-urlencoded' },
    body: dataString
};
0 голосов
/ 26 ноября 2018

После множества попыток я разобрался. Вы можете использовать код только один раз. Поэтому убедитесь, что вы используете код, полученный из URI перенаправления, только один раз.

С новым кодом используйте этот код

const dataString = "grant_type=authorization_code&client_id="+client_id+"&client_secret="+client_secret+"&redirect_uri="+redirect_uri+"&code="+req.body.code
    var options = {
        url: 'https://login.mailchimp.com/oauth2/token',
        method: 'POST',
        headers:
        {
          'Content-Type': 'application/x-www-form-urlencoded',
        },
        form: dataString
    };
    function callback(error, response, body) {
      if (!error) {
        let str = JSON.stringify(body)
        res.setHeader("Content-Type", "application/json; charset=utf-8")
        res.send(body)
      }
      else{
        console.dir(error);
        res.send(error)
      }

    }
    request(options, callback);
0 голосов
/ 04 мая 2018

Хм, вы забыли определить request?

var request = require("request");
...