Axios请求Spotify POST接口获取token返回400 Bad Request求助
Axios调用Spotify Token接口返回400 Bad Request问题修复
以下是代码中会触发该错误的常见问题,按出现概率从高到低排列:
- 首先确认你已经正确导入
qs库:代码里用到了qs.stringify格式化表单数据,如果顶部没有写const qs = require('qs'),传入的data格式完全不符合接口要求,会直接返回400。不要用JSON.stringify转data,Spotify的token接口只接受application/x-www-form-urlencoded格式的参数。 - 检查
redirect_uri的值:该值必须和你在Spotify开发者后台配置的回调地址完全一致,差一个尾斜杠、http/https协议不匹配、端口号不对、路径大小写有差异,都会被Spotify判定为非法请求返回400,这个是90%的人踩的坑。 - 授权码
code有效性问题:Spotify返回的授权码只能使用一次,有效期仅5分钟,重复使用、超时使用都会触发invalid_grant类型的400错误。注意code直接取req.query.code的原值即可,不要做额外的编码、解码处理。 - 凭证拼接问题:检查
client_id和client_secret是否和后台显示的一致,拼接Basic认证头的时候,两个值中间的冒号不能漏,base64编码前不要加多余空格。 - 错误捕获逻辑问题:你当前直接
res.send(error)拿不到Spotify返回的具体错误原因,Axios的接口报错详情存在error.response.data字段里,临时打印这个字段可以直接看到Spotify返回的明确错误码(比如invalid_redirect_uri/invalid_client/invalid_grant),能快速定位具体问题。 - 兜底值问题:不要给code设
null的兜底值传给接口,如果req.query.code不存在应该直接返回错误,传null给接口必然触发400。
修正后的可运行代码参考:
const express = require('express'); const axios = require('axios'); const qs = require('qs'); // 必须手动安装并引入qs:npm i qs const app = express(); // 以下配置必须和Spotify开发者后台填写的内容完全一致 const client_id = '替换为你的应用Client ID'; const client_secret = '替换为你的应用Client Secret'; const redirect_uri = 'http://localhost:3000/auth/callback'; app.get("/auth/callback", async (req, res) => { try{ const code = req.query.code; if (!code) { return res.status(400).send('缺少授权码code'); } const requestData = qs.stringify({ grant_type: "authorization_code", code: code, redirect_uri: redirect_uri, }); const tokenResponse = await axios.post('https://accounts.spotify.com/api/token', requestData, { headers: { 'Authorization': `Basic ${Buffer.from(`${client_id}:${client_secret}`).toString('base64')}`, 'Content-Type': 'application/x-www-form-urlencoded', }, }) // 不要直接返回axios的完整response对象,取data字段才是接口返回的token数据 res.json(tokenResponse.data); }catch(error){ // 打印错误详情方便排查 console.error('Spotify token请求失败:', error.response?.data); res.status(500).json(error.response?.data || { msg: '请求令牌失败' }); } }) app.listen(3000, () => { console.log('服务运行在3000端口'); });
额外注意:本地调试时,localhost和127.0.0.1会被Spotify判定为不同地址,后台配置的是哪个就用哪个,不要混用。
内容的提问来源于stack exchange,提问作者Donavan
相关产品推荐
相关产品推荐

