我正在尝试对公共FHIR服务器进行API调用(SMART Health IT)。我已经托管了我的应用程序(前端)在服务器上使用ngrok
,我想在从FHIR检索所需数据之前获取其授权代码和访问令牌。我正在使用SMART Launcher启动我的应用(https://launch.smarthealthit.org/?tab=1&launch=WzAsIiIsIiIsIkFVVE8iLDAsMCwwLCIiLCIiLCIiLCIiLCIiLCIiLCIiLDEsMV0&validation=1)并在这里传递一些客户端ID和客户端密钥。然后,我试图在代码中使用这些值来检索授权码和令牌。
我正在使用Python的OAuth2.0库,其中我使用WebApplicationClient来获取授权URL。https://URL/?error=invalid_request&error_description=Invalid+launch+options%3A+SyntaxError%3A+Unexpected+end+of+JSON+input
个
为什么会这样?我在这里做错了什么吗?下面是我写的代码。另外,我不知道如何在我的代码中以编程方式获取authorization_response
(假设第一个问题已经解决)。
注意:redirect_uri
是我在ngrok上托管的应用的URL,是一个纯前端应用。
client = WebApplicationClient(client_id)
authorize_endpoint = "https://launch.smarthealthit.org/v/r4/auth/authorize"
redirect_uri = "https://URL"
authorization_url = client.prepare_request_uri(
authorize_endpoint,
redirect_uri = redirect_uri
)
print('Authorization URL: ', authorization_url)
parsed_response = client.parse_request_uri_response(authorization_response)
authorization_code = parsed_response["code"]
字符串
上面是导致错误的代码部分。我在这一步卡住了。我提供了我写的其余代码(下面)作为参考和上下文。它假设授权代码已经成功获得,并尝试获取访问令牌。
data = client.prepare_request_body(
code = authorization_code,
redirect_uri = redirect_uri,
client_id = client_id,
client_secret = client_secret
)
print('Token data: ', data)
token_response = requests.post(token_endpoint, data=data, headers={"Content-Type": "application/x-www-form-urlencoded"})
if token_response.status_code == 200:
access_token = token_response.json()["access_token"]
print("Access Token:", access_token)
else:
print("Error obtaining access token:", token_response.text)
型
1条答案
按热度按时间bnl4lu3b1#
根据评论,听起来你想让这是一个从EHR启动的SMART on FHIR应用程序。在这种情况下,你的授权URL的构建似乎不完整。你有
authorization_url = client.prepare_request_uri(authorize_endpoint, redirect_uri = redirect_uri)
。这将导致https://launch.smarthealthit.org/v/r4/auth/authorize?client_id=<client_id>&response_type=code&redirect_uri=https%3A%2F%2FURL
的授权调用。这个电话不见了...
launch
参数,设置为EHR提供的启动代码。scope
参数,它定义了所需的作用域。通常它被设置为launch openid fhirUser
,但只有你知道需要什么(在这个场景中需要“launch”)。aud
参数,定义您计划调用的FHIR服务器。这是由EHR在iss
参数中提供的。state
参数,这是任意的,但出于安全原因使用。SMART IG的解释可能对您有帮助。上述信息假设您使用的服务器支持SMART实施指南的最新版本。您的服务器可能不需要某些参数。