如何从SUUNTO API OAuth2获取code与jwt?Python脚本请求失败求助
问题原因排查
- 参数传递位置错误:你curl里的
grant_type/redirect_uri/code都是用-d参数以表单形式放在请求体提交的,属于application/x-www-form-urlencoded类型,但是Python代码里把参数都拼到了URL的查询字符串里,不符合OAuth2令牌接口的参数接收要求,而且还漏传了必填的空值redirect_uri参数。 - 请求头传参错误:requests.post的第二个位置参数是
data(请求体内容),你直接把header字典作为第二个参数传入,会被requests当成请求体发送,请求头根本没有生效,请求头需要用headers=关键字参数显式指定。 - Basic认证构造错误:你手写的
Basic Base64{user:pwd}格式不符合标准,标准格式是Basic后面直接跟client_id:client_secret的Base64编码结果,不需要加Base64{}的包裹。更稳妥的方式是直接用requests内置的HTTPBasicAuth来生成认证头,避免手动编码出错。
修复后的代码示例
import requests from requests.auth import HTTPBasicAuth # 替换为你的实际值 CLIENT_ID = "你的client_id" CLIENT_SECRET = "你的client_secret" AUTH_CODE = "步骤4.4返回的授权码" REDIRECT_URI = "" # 和curl里传的空值保持一致即可 def jwtRequest(): url = 'https://cloudapi-oauth.suunto.com/oauth/token' # 所有表单参数放在data字典里,不要拼到URL payload = { "grant_type": "authorization_code", "client_id": CLIENT_ID, "code": AUTH_CODE, "redirect_uri": REDIRECT_URI } # 用内置auth构造Basic认证头,不需要手动写Authorization req = requests.post( url, data=payload, auth=HTTPBasicAuth(CLIENT_ID, CLIENT_SECRET) ) # 可按需开启打印排查问题 # print(req.status_code) # print(req.text) return req
内容的提问来源于stack exchange,提问作者CarlosFSousa
相关产品推荐
相关产品推荐

