OAuth2获取AccessToken时返回Bad Credentials问题求助
解决OAuth2获取AccessToken时的Bad Credentials问题
我帮你排查下这个报错的原因,看你的代码里有几个关键问题需要修正:
请求方法用错了:OAuth2的
password授权模式要求使用POST请求,而不是GET。一方面GET会把敏感的用户名/密码暴露在URL里,另一方面绝大多数OAuth2服务端只接受POST请求来颁发token。grant_type参数冲突:你在headers里写了
grant_type: client_credentials,但params里又指定了grant_type: password,这会让服务端搞不清你要用哪种授权模式。而且grant_type不需要放在headers里,应该统一放在表单参数中。参数传递方式不对:既然设置了
Content-Type: application/x-www-form-urlencoded,就应该把参数放在请求体(data参数)里,而不是GET请求的params里——POST请求的表单数据要通过data传递才符合规范。
修正后的代码
import requests # 替换成你的实际客户端ID和密钥 CLIENT_ID = "your_client_id" CLIENT_SECRET = "your_client_secret" url = "http://172.15.39.95:8080/oauth/token" # 统一表单参数,明确使用password授权模式 form_data = { "grant_type": "password", "username": "xxxxx", "password": "xxxxxx" } # 保持HTTP Basic认证的正确使用 client_auth = requests.auth.HTTPBasicAuth(CLIENT_ID, CLIENT_SECRET) # 只保留必要的Accept头,Content-Type会由requests自动处理(因为用了data参数) headers = { 'Accept': 'application/json' } # 改用POST请求,传递表单数据 response = requests.post(url, data=form_data, auth=client_auth, headers=headers) # 打印响应内容,方便排查剩余问题 print(response.status_code) print(response.json())
额外检查建议
- 确认
CLIENT_ID和CLIENT_SECRET是服务端针对password模式配置的有效客户端凭证,不要和其他模式的凭证搞混 - 手动验证用户名和密码是否正确(比如通过服务端的登录页面测试)
- 如果服务端要求HTTPS,记得把URL里的
http改成https
内容的提问来源于stack exchange,提问作者Amir Naimi
相关产品推荐
相关产品推荐

