我试图向公共FHIR服务器(如SMART Health IT)进行FHIR调用。为此,我有一个使用ngrok托管的应用程序,我正在使用自定义 client_id 和 client_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 库。
1条答案
按热度按时间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()
正在自动处理,但如果没有,则需要提供标头。token_request_data
对象的意义是什么?它似乎没有在任何地方使用。1.您正在使用客户端机密对JWT进行签名。如果这是一个典型的机密(如密码),则不正确。您应该使用正确生成的公钥-私钥对中的私钥对其进行签名。(如果您使用SMART沙箱,则需要使用它已经生成的密钥对。)