无法在node.js中交换访问令牌的代码。 Mailchimp API

时间:2018-05-03 00:12:19

标签: node.js oauth-2.0 mailchimp mailchimp-api-v3.0

我正在尝试将OAuth2与Mailchimp API一起使用,我正在关注他们的文档,但我无法完成第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本身。

我不完全确定我在这里做错了什么。我提出的请求看起来几乎与文档中的curl写的一致。那么我哪里出错?

3 个答案:

答案 0 :(得分:0)

嗯,你忘记定义request了吗?

var request = require("request");

答案 1 :(得分:0)

终于明白了。问题出在请求的标题中。有两种方法可以解决这个问题。第一种是使用“形式”而不是“数据”。如果使用“表单”选项,请求会自动包含“content-type:x-www-form-urlencoded”标题。

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

我不确定在使用“data”选项时是使用了什么标头,或者根本没有声明内容类型。无论哪种方式,如果您选择继续使用“数据”选项,您可以手动声明内容类型标头。这是第二种可能的解决方案。

var options = {
    url: 'https://login.mailchimp.com/oauth2/token',
    method: 'POST',
    headers: 
    { 'Content-Type': 'application/x-www-form-urlencoded' },
    body: dataString
};

答案 2 :(得分:0)

经过多次尝试,我发现了。您只能使用一次代码。因此,请确保仅使用一次从重定向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);