我正在通过this tutorial创建一个使用Spotify API的应用程序。一切都进行得很顺利,直到我使用身份验证代码流进行身份验证的回调部分。
(我在Spotify应用程序中注册了回叫URL。)
就我所知,我的代码与本教程和其他教程使用的回调路由相匹配。值得注意的是,http库是axios。下面是回调方法:
app.get("/callback", (req, res) => {
const code = req.query.code || null;
const usp = new URLSearchParams({
code: code,
redirect_uri: REDIRECT_URI,
grant_type: "authorization_code",
});
axios({
method: "post",
url: "https://accounts.spotify.com/api/token",
data: usp,
headers: {
"content-type": "application/x-www-form-urlencoded",
Authorization: `Basic ${new Buffer.from(`${CLIENT_ID}:${CLIENT_SECRET}`).toString("base64")}`,
},
})
.then(response => {
console.log(response.status); // logs 200
console.log(response.data); // logs encoded strings
if (response.status === 200) {
res.send(JSON.stringify(response.data))
} else {
res.send(response);
}
})
.catch((error) => {
res.send(error);
});
虽然响应代码是200,但下面是www.example.com中返回的示例response.data:"\u001f�\b\u0000\u0000\u0000\u0000\u0000\u0000\u0003E�˒�0\u0000Ee�uS\u0015��\u000e�(\b\u0012h\u0005tC%\u0010\u0014T\u001e�����0��^:���p\u0014Ѻ\u000e��Is�7�:��\u0015l��ᑰ�g�����\u0"
它看起来像是被编码的,但是我不知道它是如何被编码的(我尝试了base-64解编码),也不知道为什么它不是以普通JSON的形式返回的。这不仅阻止了我将它记录到控制台--我也不能访问我希望在响应主体中存在的字段,比如access_token。是否有什么参数可以传递给axios来告诉我“这应该是json”?
有趣的是,如果我使用npm 'request'包而不是axios,并将'json:true'参数,我得到了一个有效的令牌,我可以打印出来,并作为一个常规的旧字符串查看。下面是可以工作的代码。但我真的很想了解为什么我的axios方法不能。
app.get('/callback', function(req, res) {
// your application requests refresh and access tokens
// after checking the state parameter
const code = req.query.code || null;
const state = req.query.state || null;
const storedState = req.cookies ? req.cookies[stateKey] : null;
res.clearCookie(stateKey);
const authOptions = {
url: 'https://accounts.spotify.com/api/token',
form: {
code: code,
redirect_uri: REDIRECT_URI,
grant_type: 'authorization_code',
},
headers: {
Authorization: `Basic ${new Buffer.from(`${CLIENT_ID}:${CLIENT_SECRET}`).toString('base64')}`,
},
json: true,
};
request.post(authOptions, function (error, response, body) {
if (!error && response.statusCode === 200) {
const access_token = body.access_token;
const refresh_token = body.refresh_token;
var options = {
url: 'https://api.spotify.com/v1/me',
headers: { Authorization: 'Bearer ' + access_token },
json: true,
};
// use the access token to access the Spotify Web API
request.get(options, function(error, response, body) {
console.log(body);
});
// we can also pass the token to the browser to make requests from there
res.redirect('/#' + querystring.stringify({
access_token: access_token,
refresh_token: refresh_token,
}));
} else {
res.redirect(`/#${querystring.stringify({ error: 'invalid_token' })}`);
}
});
});
1条答案
按热度按时间hkmswyz61#
您需要在www.example.com标题中添加
Accept-Encoding
与application/json
axios.post。默认值为
gzip