尝试使用OAuth2.0调用/token端点时出现“Invalid launch options:TypeError [ERR_INVALID_ARG_TYPE]”

ne5o7dgx  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(162)

我试图向公共FHIR服务器(如SMART Health IT)进行FHIR调用。为此,我有一个使用ngrok托管的应用程序,我正在使用自定义 client_idclient_secret 在他们的服务器上启动此应用程序。我试图使用下面的代码片段从他们的/token端点获取访问和刷新令牌。然而,我收到错误-
{“error”:“invalid_request”,“error_description”:“无效的启动选项:TypeError [ERR_INVALID_ARG_TYPE]:第一个参数必须是string类型或Buffer、ArrayBuffer或Array的示例或类似Array的Object。接收到的未定义”}。
为什么会发生这种情况,我如何解决这个问题并进行正确的API调用?

token_endpoint = "https://launch.smarthealthit.org/v/r4/auth/token" 

token_request_data = {
    "grant_type": "client_credentials",
    "redirect_uri": redirect_uri,
    "client_id": client_id,
    "client_secret": client_secret,
}
payload = {
    "iss": f"{client_id}",
    "sub": f"{client_id}",
    "aud": f"{token_endpoint}",
    "jti": str(uuid.uuid1()),
    "exp": time.time() + 60*5
}

jwt_token = jwt.encode(payload, key=client_secret, algorithm="RS384").decode()
grant_type = 'client_credentials'
client_assertion_type = 'urn:ietf:params:oauth:client-assertion-type:jwt-bearer'.replace(':', "%3A")
body = 'grant_type=' + grant_type + '&client_assertion_type=' + client_assertion_type + '&client_assertion=' + jwt_token

token_response = requests.post(token_endpoint, data=body, headers={"Content-Type": "application/x-www-form-urlencoded"})

字符串
请注意,我只在Python中使用 requests 库。

0yycz8jy

0yycz8jy1#

可以肯定的是,根本原因是您使用了错误的https://launch.smarthealthit.org/v/r4基URL,因为那里没有定义CapabilityStatement。看起来您正在尝试使用后端OAuth,因此您的令牌调用应该是https://launch.smarthealthit.org/v/r4/sim/WzQsIiIsIiIsIiIsMCwwLDAsIiIsIiIsIiIsIiIsIiIsIiIsIiIsMCwxXQ/fhir/auth/token
当你在它,一些其他的事情:
1.您的JWT缺少所需的标头。可能jwt.encode()正在自动处理,但如果没有,则需要提供标头。

  1. token_request_data对象的意义是什么?它似乎没有在任何地方使用。
    1.您正在使用客户端机密对JWT进行签名。如果这是一个典型的机密(如密码),则不正确。您应该使用正确生成的公钥-私钥对中的私钥对其进行签名。(如果您使用SMART沙箱,则需要使用它已经生成的密钥对。)

相关问题