使用Django OAuth授权码流获取Token时遇invalid_grant错误
Django OAuth Toolkit授权码流获取令牌返回"invalid_grant"错误
问题场景
我正在使用Django OAuth Toolkit的**authorization code flow(授权码流)**获取访问令牌,授权类型为authorization_code。发起POST请求到令牌端点后,始终返回错误:
{"error": "invalid_grant"}
已确认授权码未过期,服务器与本地时间同步,授权码有效期为5分钟,有效期内仍无法正常获取令牌。
发起请求的curl代码
curl --location --request POST 'http://127.0.0.1:8000/o/token/' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --header 'Cache-Control: no-cache' \ --header 'Accept: application/json' \ --data-urlencode 'client_id=ngta3GGa3jP6Rmv5Tspj97Bk4aiitHgv1EQilCDS' \ --data-urlencode 'client_secret=zLwMyuXg7WCSFwUDYBxFP3QxHh5mF6xM2hBsKyvRbypac5lV7fl2NoFeeDG3afWWxLedA7qtzD2Mvf68qyBra3A4iUXXlDXJO4LvxuZv4UULU6NLWlObpD0ylQSXbwZD' \ --data-urlencode 'code=q4NfBMbyTNbcIQZ4j7SfgMWL898psv' \ --data-urlencode 'redirect_uri=http://localhost:8000/no/callback/' \ --data-urlencode 'code_verifier=b'\''SlJDWEgyRzNYMks0RTVQVDlRVkFaOFdDUkxHV1A3QURMTjNITFdaMTBLU0tWQkkzMUVWVEZFU0k='\''' \ --data-urlencode 'grant_type=authorization_code'
排查方向与解决方案
- 修正
code_verifier格式:当前参数里带有Python字节字符串标识b'',实际请求需去掉包裹,直接传入原始字符串:SlJDWEgyRzNYMks0RTVQVDlRVkFaOFdDUkxHV1A3QURMTjNITFdaMTBLU0tWQkkzMUVWVEZFU0k= - 校验
redirect_uri完全匹配:确保请求中的redirect_uri和获取授权码时使用的地址完全一致,包括协议、域名、端口、路径,哪怕末尾斜杠的差异都可能触发错误 - 确认授权码未被复用:授权码是一次性凭证,一旦使用过就会失效,即使在有效期内也无法重复使用,需重新获取新的授权码
- 检查客户端配置:在Django后台的OAuth应用设置中,确认客户端类型为
confidential,授权类型包含authorization-code,且client_id、client_secret与请求参数完全一致 - 排查中间件干扰:若项目启用了CSRF中间件,确认
/o/token/端点已被排除在CSRF验证之外,自定义中间件可能会拦截或篡改请求参数
内容的提问来源于stack exchange,提问作者Yusra Masood
相关产品推荐
相关产品推荐

