无法在 node.js 中交换代码以获取访问令牌。 Mailchimp API
Unable to exchange code for access token in node.js. Mailchimp API
我正在尝试将 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 写的几乎相同。那我哪里错了?
嗯,你是不是忘了定义request
?
var request = require("request");
终于想通了。问题出在请求的 header 中。有两种方法可以解决这个问题。第一种是使用 "form" 而不是 "data"。如果使用 "form" 选项,请求 会自动包含 "content-type: x-www-form-urlencoded" header。
var options = {
url: 'https://login.mailchimp.com/oauth2/token',
method: 'POST',
form: dataString
};
我不确定在使用 "data" 选项时使用什么 header,或者如果根本没有声明 content-type。无论哪种方式,如果您选择继续使用 "data" 选项,您可以手动声明一个 content-type header。这是第二种可能的解决方案。
var options = {
url: 'https://login.mailchimp.com/oauth2/token',
method: 'POST',
headers:
{ 'Content-Type': 'application/x-www-form-urlencoded' },
body: dataString
};
经过多次尝试,我想通了。您只能使用一次代码。因此,请确保您只使用一次从重定向 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);
我正在尝试将 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 写的几乎相同。那我哪里错了?
嗯,你是不是忘了定义request
?
var request = require("request");
终于想通了。问题出在请求的 header 中。有两种方法可以解决这个问题。第一种是使用 "form" 而不是 "data"。如果使用 "form" 选项,请求 会自动包含 "content-type: x-www-form-urlencoded" header。
var options = {
url: 'https://login.mailchimp.com/oauth2/token',
method: 'POST',
form: dataString
};
我不确定在使用 "data" 选项时使用什么 header,或者如果根本没有声明 content-type。无论哪种方式,如果您选择继续使用 "data" 选项,您可以手动声明一个 content-type header。这是第二种可能的解决方案。
var options = {
url: 'https://login.mailchimp.com/oauth2/token',
method: 'POST',
headers:
{ 'Content-Type': 'application/x-www-form-urlencoded' },
body: dataString
};
经过多次尝试,我想通了。您只能使用一次代码。因此,请确保您只使用一次从重定向 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);