Ebay OAuth 授权码模式换用户访问令牌报invalid_grant错误求助
invalid_grant 报错排查指南 报错场景
使用eBay沙箱接口时,client_credentials 凭证模式调用完全正常;切换为authorization_code 用户授权模式换取令牌时,返回报错:
{'error': 'invalid_grant', 'error_description': 'the provided authorization grant code is invalid or was issued to another client'}
核心排查点
变量名不匹配导致授权码提取错误
现有代码逻辑中,接收用户输入的重定向地址时赋值给了url变量,但后续提取授权码时却调用了从未赋值的auth_res_url对象做字符串切片:url = input('enter url: ') start_number = auth_res_url.find('code=') + len('code=') end_number = auth_res_url.find('&expires_in') auth_code = auth_res_url[start_number:end_number]这个操作拿到的授权码是无效值,直接触发校验失败。同时手动字符串切片的方式容易截断URL编码的授权码,建议直接用标准URL解析库提取参数,不要硬切字符串。
重定向URI三端不一致
OAuth2协议要求三个位置的redirect_uri必须逐字符完全相同,任何差异都会触发上述报错:- 授权链接中拼接的回调地址
- eBay开发者后台应用配置里注册的回调地址
- 换取令牌时请求体里携带的回调地址
现有代码中,换令牌阶段传的是占位值XXXXX HIDDEN XXXXX,和授权链接里写的Soft_ware_-Software-Softwa-zwdqqdbxx完全不匹配,是触发报错的核心原因。
注意这个回调地址不需要是公网可访问的真实服务地址,仅需三者保持字符完全一致即可完成校验。
授权码本身不符合校验规则
eBay的授权码有效期极短(约60秒),且为一次性使用:- 拿到授权码后必须立刻发起换令牌请求,延迟超过有效期会直接失效
- 同一个授权码只能使用一次,重复调用换令牌接口会判定无效
- 沙箱环境生成的授权码不能用于生产环境接口,反之同理
客户端凭证不匹配
即使client_credentials模式可正常调用,也要确认换令牌时Basic认证头携带的应用ID、应用密钥,和生成授权码时使用的客户端ID完全归属同一个应用,跨应用、跨环境的凭证搭配授权码,会直接被判定为“授权码发放给了其他客户端”。
修复后的关键逻辑
把三个位置的重定向URI提取为全局固定常量,统一使用URL解析库提取授权码,换令牌时保持所有参数和授权阶段完全一致,即可解决校验报错问题。
内容的提问来源于stack exchange,提问作者zeroalpha

