You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 02:18:03