如何通过FHIR API访问患者数据及实现类OneRecord的认证聚合功能?
Epic MyChart基于SMART on FHIR框架实现OAuth2授权,要通过脚本访问自己的数据,核心走授权码流程,步骤如下:
注册开发者应用
先在Epic开发者门户完成应用注册,获取client_id和redirect_uri(Epic对第三方应用有审核要求,个人测试需确保符合他们的开发者政策)。构造授权请求并获取授权码
拼接Epic MyChart的授权端点URL,参数包含client_id、redirect_uri、response_type=code、所需权限scope(比如launch/patient patient/*.read)。让用户访问该URL完成登录授权,授权后会跳转到你配置的redirect_uri,并携带code参数。交换访问令牌
用拿到的code、client_id、redirect_uri向Epic的令牌端点发送POST请求,获取access_token和refresh_token。调用FHIR API获取数据
把access_token放在HTTP请求头的Authorization: Bearer {token}中,访问Epic的FHIR基础端点(比如/Patient获取个人信息,/Observation获取检验数据)。
Python脚本示例
import requests # 替换为你的实际配置 CLIENT_ID = "你的应用Client ID" REDIRECT_URI = "你的回调URI" # 替换为医院MyChart的实际域名 BASE_DOMAIN = "https://mychart.your-hospital.org" # 1. 生成授权URL并引导用户操作 auth_endpoint = f"{BASE_DOMAIN}/oauth2/authorize" auth_url = ( f"{auth_endpoint}?client_id={CLIENT_ID}" f"&redirect_uri={REDIRECT_URI}" f"&response_type=code" f"&scope=launch/patient patient/*.read" ) print(f"请打开以下URL登录授权:\n{auth_url}") auth_code = input("请输入回调URL中的code参数:") # 2. 交换访问令牌 token_endpoint = f"{BASE_DOMAIN}/oauth2/token" token_payload = { "grant_type": "authorization_code", "code": auth_code, "client_id": CLIENT_ID, "redirect_uri": REDIRECT_URI } token_resp = requests.post(token_endpoint, data=token_payload) token_resp.raise_for_status() tokens = token_resp.json() access_token = tokens["access_token"] # 3. 调用FHIR API获取患者数据 fhir_base_url = f"{BASE_DOMAIN}/fhir/api/FHIR/DSTU2" headers = {"Authorization": f"Bearer {access_token}"} patient_resp = requests.get(f"{fhir_base_url}/Patient", headers=headers) patient_resp.raise_for_status() print("获取到的患者数据:") print(patient_resp.json())
这类平台的核心是自动发现FHIR端点+统一OAuth2授权流程适配,具体逻辑如下:
一、医院FHIR端点自动发现
SMART on FHIR标准发现机制
所有合规的FHIR服务器都会暴露/.well-known/smart-configuration端点,访问该URL可获取完整的授权、令牌、FHIR基础URL等配置信息。比如输入医院域名https://mychart.your-hospital.org,直接请求https://mychart.your-hospital.org/.well-known/smart-configuration就能拿到所有必要的API端点地址。维护预验证医院目录
自动发现可能存在不稳定性,聚合平台通常会维护一个人工验证过的医院列表,存储每个医院的域名、FHIR版本、支持的权限范围等信息,减少自动发现的出错概率。用户搜索医院时,直接匹配列表中的条目,再调用对应域名的配置端点。
二、跨门户认证实现
统一OAuth2授权流程(带PKCE)
对于每个医院,根据发现的配置构造授权请求,在弹窗中打开医院的登录授权页面(避免页面跳转丢失平台会话)。前端应用必须使用**PKCE(Proof Key for Code Exchange)**增强安全性,无需存储client_secret,适合浏览器环境。令牌管理与会话同步
用户完成单个医院的授权后,平台存储该医院对应的access_token和refresh_token,后续调用该医院的FHIR API时直接复用令牌。同时维护用户的统一会话,让用户在平台内切换医院时无需重复登录。动态适配权限范围
不同医院的FHIR API支持的权限scope可能不同,平台需根据发现的配置动态调整授权请求中的scope参数,确保能获取到所需的数据权限。
内容的提问来源于stack exchange,提问作者Rabot Snek

