Fhir Epic Sandbox:使用 JWT 获取后端服务的访问令牌

问题描述 投票:0回答:2

我正在尝试使用来自 https://fhir.epic.com/ 的沙箱作为后端服务。

我正在关注本教程:https://fhir.epic.com/Documentation?docId=oauth2§ion=BackendOAuth2Guide

  • 我已经注册了一个新应用程序,
  • 创建了 JWT(使用 SSL 密钥)
  • https://jwt.io/ 上测试了 JWT:工作正常!

但我无法将 JWT POST 到端点以获取访问令牌。我应该向此 URL 发送 POST 请求:

https://fhir.epic.com/interconnect-fhir-oauth/oauth2/token

我正在使用 python,这是我到目前为止的代码:

import json
import requests
from datetime import datetime, timedelta, timezone
from requests.structures import CaseInsensitiveDict
from jwt import (
    JWT,
    jwk_from_dict,
    jwk_from_pem,
)
from jwt.utils import get_int_from_datetime


def main():
    instance = JWT()
    message = {
        # Client ID for non-production
        'iss': '990573e-13e3-143b-8b03-4fbb577b660',
        'sub': '990573e-13e3-143b-8b03-4fbb577b660',
        'aud': 'https://fhir.epic.com/interconnect-fhir-oauth/oauth2/token',
        'jti': 'f9eaafba-2e49-11ea-8880-5ce0c5aee679',
        'iat': get_int_from_datetime(datetime.now(timezone.utc)),
        'exp': get_int_from_datetime(datetime.now(timezone.utc) + timedelta(hours=1)),
    }

    # Load a RSA key from a PEM file.
    with open('/home/user/ssl/privatekey.pem', 'rb') as fh:
        signing_key = jwk_from_pem(fh.read())

    compact_jws = instance.encode(message, signing_key, alg='RS384')
    print(compact_jws)

    headers = CaseInsensitiveDict()
    headers['Content-Type'] = 'application/x-www-form-urlencoded'

    data = {
      'grant_type': 'client_credentials',
      'client_assertion_type': 'urn:ietf:params:oauth:client-assertion-type:jwt-bearer',
      'client_assertion': compact_jws
    }
    
    x = requests.post('https://fhir.epic.com/interconnect-fhir-oauth/oauth2/token', headers=headers, data=data)
    print(x.text)

但我总是收到 400 错误:

{
  "error": "invalid_client",
  "error_description": null
}

网址正确吗?我如何获得访问令牌来玩沙盒?

python python-requests jwt hl7-fhir smart-on-fhir
2个回答
4
投票
'exp': get_int_from_datetime(datetime.now(timezone.utc) + timedelta(hours=1)),

乍一看,这似乎是您的问题。 Epic 要求

exp
不超过未来 5 分钟。

除此之外,还有几条建议:

  1. 使用 jwt.io
  2. 提供的库
  3. Jwt.io 还有一个调试器,您可以在其中粘贴 JWT 以验证它是否有效

-1
投票

您能否告知您如何获得访问令牌

© www.soinside.com 2019 - 2024. All rights reserved.