关联如何工作
连接一个数据源分两个阶段:配置凭据(由运维方一次性完成)与关联账号(按用户、所有权门控)。数据随后流入内嵌的 FHIR 存储,agent 在其中读取。关于底层契约,参见 Vendor 系统。1 —— 配置凭据
每个 vendor 按约定从环境变量读取其凭据(<ID> 是 vendor id 的大写形式):
由于名称中含
_KEY / _SECRET / _TOKEN 的配置值会在加载时自动加密(Fernet,经 CONFIG_ENCRYPTION_KEY),你也可以把这些值写进 config.yml。环境变量优先。参见配置。ehr 客户端需要租户的 FHIR 服务 base URL,可从公开的 Service Base URL 目录(ONC Lantern;Oracle Health / Cerner)发现。
2 —— 关联账号(bind → verify → data)
关联是所有权门控的:用户在读取任何数据之前先证明其拥有该外部账号,因此一个自称的 id 永远无法触及他人的记录。健康模块暴露三条路由(都需要 bearer JWT,并限定在已认证用户范围内):Bind
将外部账号 id 记录为 PENDING 关联。
各 vendor 具体的请求体可能不同;请查看该 vendor 的
.cpp 与 src/health/vendor_service.*。(verify)Verify
通过该 vendor 的同意 / 认领流程证明所有权。成功后该关联被标记为 VERIFIED。一个
UNIQUE(vendor_id, external_user_id) 约束是最后一道防线 —— 两名用户不能都认领同一个账号。连接一个 EHR(SMART on FHIR)
EHR 是网页能够自行连接的唯一临床数据源(Apple / Samsung 仅设备本地可用)。Mirobody 充当该 EHR 的 OAuth 客户端。浏览器驱动的流程位于/health/ehr/* 下:
Authorize
POST /health/ehr/authorize {fhir_base_url} 运行 SMART 发现(/.well-known/smart-configuration)+ PKCE,缓存 verifier/state,并返回供浏览器跳转的 authorize_url。SMART_FHIR_* 系列键配置 SMART 客户端(client id / redirect uri / scope;参见 config.example.yml)。在 Web 客户端中,这是 Settings → Connect EHR。
设备本地存储(此处无需关联)
Apple Health、Samsung Health、Google Health Connect 以及小米在服务端没有服务端 API,也没有关联流程。原生宿主 App 在设备本地读取它们,并把 FHIRObservation POST 到 /fhir。参见数据流。
自带 provider
如果你需要的数据源尚未发布,在src/health/vendor/ 下添加一个 vendor::Vendor 并注册它 —— 参见 Provider 集成。由于 vendor 是编译进程序的,你需要重新构建内核,而不是在运行时投放一个文件。
下一步
Provider 概览
已发布 vendor 的完整列表
配置
凭据的写入位置以及加密如何工作
Garmin 示例
一个设备品牌客户端的走查
Provider 集成
实现一个新的
vendor::Vendor