Python requests实现Sonos授权时返回invalid_request错误如何解决
Sonos授权接口invalid_request报错原因及修复方案
常见报错原因
- 回调地址不匹配:代码中填写的
redirect_uri必须和Sonos开发者后台注册应用时填报的回调地址完全一致,包括协议、域名、端口、路径,哪怕末尾多斜杠、大小写不一致都会触发报错。 - 授权码无效:
authorization_code为一次性凭证,有效期极短,重复使用、拿到凭证后间隔太久再调用兑换接口、凭证被截断/转义都会导致无效。 - Basic认证编码错误:手动拼接Base64认证头时容易出现编码格式问题,导致身份校验不通过。
- 请求参数异常:虽当前代码已覆盖必填参数,仍需确认从前端拿到的
code字段完整无篡改。
修复方案
- 优先核对回调地址:登录Sonos开发者后台,找到对应应用的配置项,确认回调地址和代码中
redirect_uri的取值http://localhost:8000/sonos完全一致。 - 重新获取授权码:每次测试都重新走用户授权流程获取新的
code,拿到后立刻调用兑换接口,避免过期。 - 优化认证逻辑,替换手动编码Base64的方案,改用requests内置的auth参数自动处理Basic认证,修改后的代码如下:
import requests client_secret = "*******************************" client_id = "*******************************" code = request.data["code"] state = request.data["state"] headers = { 'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8', } data = { 'grant_type': 'authorization_code', 'code': code, 'redirect_uri': 'http://localhost:8000/sonos' } response = requests.post( 'https://api.sonos.com/login/v3/oauth/access', headers=headers, data=data, auth=(client_id, client_secret) ) print("response status: ", response.status_code) print("response content: ", response.text)
- 若修改后仍报错,可先打印接口返回的完整状态码和响应文本,获取更详细的错误提示进一步定位问题。
内容的提问来源于stack exchange,提问作者Emmanuel Ajaero
相关产品推荐
相关产品推荐

