Google App Script调用Spotify Client Credentials Flow返回400错误咨询
问题解答
1 报错原因说明
- 首先是Authorization头末尾多了冗余的右括号:你代码里的授权头写完base64编码值后多打了一个
),导致生成的Basic凭证格式完全非法,Spotify后端无法识别到合法的Basic认证头,就默认判定你尝试使用Bearer认证方式,才会返回“仅支持合法Bearer认证”的提示。 - 改为Bearer前缀报401的原因:Bearer前缀后面需要跟请求token接口返回的有效访问令牌,你此时传的是客户端ID和密钥的Base64编码值,根本不是合法的访问令牌,自然会返回无效令牌的401错误。
- 其余隐藏的错误点:
- 请求地址错误:Spotify获取令牌的接口域名是
accounts.spotify.com,不是api.spotify.com,你填写的地址本身就是无效的。 - 请求头Content-Type设置错误:Client Credentials Flow获取令牌的请求要求提交表单格式数据,
Content-Type应为application/x-www-form-urlencoded,不能是application/json。 - payload格式错误:对应表单格式要求,payload不能序列化为JSON字符串,需要按表单键值对格式传递。
- 请求地址错误:Spotify获取令牌的接口域名是
2 可运行代码示例
function callSpotifyAPI () { // 替换为自己的客户端凭证 const SPOTIFY_CLIENT_SECRET = '你的client secret'; const SPOTIFY_CLIENT_ID = '你的client id'; const HEADERS = { 'Authorization': `Basic ${Utilities.base64Encode(SPOTIFY_CLIENT_ID + ':' + SPOTIFY_CLIENT_SECRET)}` }; // 表单格式请求体 const BODY = { 'grant_type': 'client_credentials' }; // 正确的令牌请求地址 const url = 'https://accounts.spotify.com/api/token'; const requestOptions = { 'method': 'POST', 'headers': HEADERS, 'payload': BODY, // Google App Script会自动将对象转为表单格式,无需手动序列化 'muteHttpExceptions': true, 'redirect': 'follow' }; const response = UrlFetchApp.fetch(url, requestOptions); const data = JSON.parse(response.getContentText()); // 打印返回的访问令牌,可后续调用其他业务接口使用 console.log(data.access_token); return data; }
代码可成功运行的原因
- 修复了授权头多余的右括号,保证
Basic凭证格式符合官方要求,Spotify可以正确识别客户端认证信息 - 修正了请求接口的域名,使用正确的账号服务域名
accounts.spotify.com请求令牌 - 移除了错误的
Content-Type: application/json请求头,Google App Script传递对象类型的payload时会自动设置正确的application/x-www-form-urlencoded头,符合令牌接口的参数格式要求 - 不再将请求体序列化为JSON字符串,直接传递原始对象即可适配表单格式要求,参数可以被后端正确解析
内容的提问来源于stack exchange,提问作者Mario Perry
相关产品推荐
相关产品推荐

