You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用OAuth2.0的/token端点时遇Invalid launch options错误如何解决?

SMART Health IT FHIR Token端点调用错误排查与修复

错误原因分析

你遇到的invalid_request错误,根源在于以下几个问题:

  • JWT签名算法不匹配:你使用了RS384非对称加密算法,但传入的client_secret是普通字符串(对称密钥),RS384要求使用RSA私钥签名,这会导致JWT生成过程中参数类型错误,最终传递给服务器的JWT无效,触发后端的TypeError。
  • 认证方式混淆:你同时准备了两种client_credentials认证逻辑(直接传client_id/client_secret、JWT断言),但最终请求只使用了JWT断言,却未正确匹配服务器要求的格式;另外手动转义client_assertion_type的冒号属于多余操作,requests会自动处理表单编码。
  • JWT字段格式错误:exp字段要求是整数类型的时间戳,你代码中用time.time()返回的是浮点数,会导致JWT格式不符合规范。

修复方案

推荐两种可行的修复方式,根据你的需求选择:

方式一:使用Basic认证(简单高效)

这是SMART Health IT支持的标准client_credentials认证方式,无需生成JWT,直接通过HTTP Basic Auth传递客户端信息:

import requests
from requests.auth import HTTPBasicAuth

token_endpoint = "https://launch.smarthealthit.org/v/r4/auth/token"
client_id = "你的自定义client_id"
client_secret = "你的自定义client_secret"

# 发送client_credentials请求
token_response = requests.post(
    token_endpoint,
    data={"grant_type": "client_credentials"},
    auth=HTTPBasicAuth(client_id, client_secret),
    headers={"Content-Type": "application/x-www-form-urlencoded"}
)

# 打印响应结果
print(token_response.json())

方式二:正确使用JWT断言认证(如需JWT方式)

如果必须使用JWT断言,需要修正算法匹配问题和字段格式:

import requests
import jwt
import uuid
import time

token_endpoint = "https://launch.smarthealthit.org/v/r4/auth/token"
client_id = "你的自定义client_id"
# 注意:若使用RS384,此处需传入RSA私钥字符串(格式为-----BEGIN RSA PRIVATE KEY-----开头)
# 若只有普通字符串client_secret,改用HS384对称算法
client_secret = "你的RSA私钥或对称密钥"

payload = {
    "iss": client_id,
    "sub": client_id,
    "aud": token_endpoint,
    "jti": str(uuid.uuid1()),
    "exp": int(time.time() + 60*5)  # 转换为整数时间戳
}

# 根据密钥类型选择对应算法:RSA私钥用RS384,对称密钥用HS384
jwt_token = jwt.encode(payload, key=client_secret, algorithm="RS384")
# PyJWT 2.0+版本无需decode(),直接返回字符串;旧版本可添加.decode()

token_response = requests.post(
    token_endpoint,
    data={
        "grant_type": "client_credentials",
        "client_assertion_type": "urn:ietf:params:oauth:client-assertion-type:jwt-bearer",
        "client_assertion": jwt_token
    },
    headers={"Content-Type": "application/x-www-form-urlencoded"}
)

print(token_response.json())

关键注意事项

  • 不要手动转义client_assertion_type中的冒号,requests会自动处理表单数据的URL编码。
  • 使用JWT时,确保exp字段为整数时间戳,否则会导致JWT无效。
  • RS384算法需要对应RSA私钥,若你只有普通字符串类型的client_secret,建议改用HS384对称算法,并确认服务器端支持该算法。

内容的提问来源于stack exchange,提问作者coolest-duck

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 04:16:31