TPIsoftwareOSPO/digiRunner-Open-Source
GitHub: TPIsoftwareOSPO/digiRunner-Open-Source
一款轻量级企业级 API 网关,提供微服务流量治理与 AI 服务编排能力,帮助团队统一管理 API 并安全接入大语言模型。
Stars: 306 | Forks: 16
[][tpi-url]
# digiRunner:API 与 AI 服务的统一控制平面
安全地将您的基础设施与 AI 革命连接起来。
这是一个企业级 API Gateway,旨在精准治理 Microservices 并编排大型语言模型 (LLMs)。
[TPI.dev](https://tpi.dev) | [文档](https://docs.tpi.dev/) | [博客](https://tpi.dev/blog) | [社区](https://github.com/TPIsoftwareOSPO/digiRunner-Open-Source/discussions)| [LinkedIn](https://www.linkedin.com/company/opentpi/)
## 目录
- [概述](#overview)
- [快速开始](#quick-start)
- [使用 Container](#1-using-container)
- [选项 1:Docker](#option-1-docker)
- [选项 2:Docker-Compose](#option-2-docker-compose)
- [选项 3:Kubernetes](#option-3-kubernetes)
- [选项 4:Helm](#option-4-helm)
- [在本地计算机上即时运行 digiRunner](#2-run-digirunner-instantly-on-your-local-machine)
- [运行您自己的构建](#3-run-your-own-build)
- [创建简单的 Api 代理](#create-a-simple-api-proxy)
- [文档](#documentation)
- [构建您自己的 JAR](#build-your-own-jar)
- [在本地 Container Registry 中运行 digiRunner](#run-digirunner-in-a-local-container-registry)
## 概述
digiRunner 是一款专为现代混合云设计的轻量级、高性能 API Gateway。随着企业竞相采用生成式 AI,它们面临着一系列新的挑战:不可预测的成本、供应商锁定,以及将内部数据暴露给公共模型所带来的安全风险。
digiRunner 超越了传统的流量管理,进化为您的 AI Gateway。它在您的应用与 AI 提供商(如 OpenAI、Azure 或本地 Ollama 实例)之间充当智能桥梁,让您能够将业务逻辑与快速变化的 AI 领域解耦。
借助 digiRunner,您将停止硬编码 API 密钥,并开始将 AI 作为受治理的基础设施资产进行管理。
## 为什么选择 digiRunner AI Gateway?
我们提供了标准模型 API 所缺乏的 Guardrails 和治理能力。
1. 🛡️ 零供应商锁定(通用接口)
不再需要在每次发布新模型时重写代码。
- 供应商抽象:集中定义您的 AI 供应商(例如 OpenAI、Azure)和模型配置。您的应用调用统一的 digiRunner endpoint,让您无需部署新代码即可即时切换后端模型。
- 安全的密钥管理:永远不再在客户端代码中暴露提供商的 API 密钥。digiRunner 会在 gateway 层安全地注入凭据。
2. 💰 FinOps 与 Tokenomics 控制
传统的速率限制(每分钟请求数)在处理 LLM 时会失效,因为单次请求可能会消耗超过 1 万个 token。digiRunner 深刻理解 Tokenomics。
- 细粒度的成本控制:强制执行严格的输入限制(防止长上下文滥用)和输出限制(防止失控生成)。
- 灵活的策略:选择“拒绝”(硬停止)以限制预算,或选择“继续使用”以允许流量通过,同时标记超额部分以供审计。
3. 📝 将 Prompt Engineering 作为基础设施
像对待 API 一样对待您的 Prompt——进行版本控制、集中管理并保持可见。
- 模板注册表:使用内置的 AI Prompt 模板引擎,在全球范围内创建、更新和启用/禁用 prompt。
- 标准化:确保所有应用程序都使用经过批准和优化的 prompt,以减少幻觉并确保品牌一致性。
## 解决真实的 API 挑战
| **挑战** | **digiRunner 解决方案** |
|-------------------------------------------|------------------------------------------------------------------------------------------|
| 访问控制不一致 | 可视化 RBAC、API 密钥、支持 OAuth2 和 OIDC |
| 杂乱无章的 Microservice endpoint | 具备智能路由的统一 API Gateway |
| 开发和运维人员的学习曲线陡峭 | UI 驱动的配置 + AI 驱动的文档 |
| 孤立的日志和监控盲区 | 内置仪表盘和实时分析 |
| 缓慢的 API 拖累整体系统性能。 | 具备“快速通道”的智能流量整形优先处理快速 API,防止系统出现瓶颈。 |
| 对性能的可见性有限 | 追踪 API 性能并在用户之前捕捉异常 |
| 缺乏可扩展性和治理能力 | 构建具有基于策略的流量控制和企业级安全性的 API 优先应用 |
## 核心 API 管理功能
在底层,digiRunner 依然是处理标准 RESTful 服务的强大引擎:
- 高性能:专为高并发环境设计的低延迟路由。
- K8s 与混合云就绪:与 Kubernetes (K3s/Rancher) 无缝集成,适用于本地或云端部署。
- 全生命周期管理:在单一仪表盘中设计、发布、保护和分析您的 API。
## digiRunner 的适用场景:真实业务场景
digiRunner 赋能各行各业的团队,轻松实施关键任务的 API 管理用例:
• 金融服务 – 在数字银行和金融科技生态系统中执行安全标准,并控制对客户交易 API 的访问。
• 零售与电子商务 – 在流量高峰期,通过内置的速率限制、版本控制和监控来管理目录、库存和结账 API。
• 医疗保健与保险 – 通过细粒度的访问策略和审计追踪来治理敏感的 API endpoint。
• 软件与 SaaS 提供商 – 提供具备清晰文档和使用分析的、可扩展且安全的 API 层,以赋能合作伙伴和开发者。
• 政府与公共部门 – 将遗留系统与现代服务 API 统一在单个网关下,简化外部集成并确保合规性。
这些用例建立在 digiRunner 在可观测性、可扩展性和治理方面的核心优势之上——为团队提供了实现增长与敏捷的稳定基础。
## 服务架构
## 快速开始
### 1. 使用 Container
选择以下选项之一以通过容器启动服务
#### 选项 1:Docker
```
docker run -it -d -p 31080:18080 tpisoftwareopensource/digirunner-open-source
```
#### 选项 2:Docker-Compose
```
name: digirunner-open-source
services:
dgr:
image: tpisoftwareopensource/digirunner-open-source
ports:
- "31080:18080"
environment:
- TZ=Asia/Taipei
```
- 将上述配置保存为 `opendgr-compose.yml`
- 在与 `opendgr-compose.yml` 相同的目录下运行 `docker-compose -f opendgr-compose.yml up -d`
#### 选项 3:Kubernetes
```
apiVersion: v1
kind: Service
metadata:
name: digirunner-open-source-svc
spec:
ports:
- name: tcp
nodePort: 31080
port: 18080
protocol: TCP
targetPort: 18080
selector:
app: digirunner
sessionAffinity: None
type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: digirunner
name: digirunner-open-source-deploy
spec:
replicas: 1
selector:
matchLabels:
app: digirunner
template:
metadata:
labels:
app: digirunner
namespace: digirunner-open-source-ns
spec:
containers:
- env:
- name: TZ
value: Asia/Taipei
image: tpisoftwareopensource/digirunner-open-source
imagePullPolicy: Always
name: digirunner
ports:
- containerPort: 18080
name: tcp
protocol: TCP
workingDir: /opt/digirunner
```
- 将上述配置保存为 `digirunner-open-source.yml`
- 运行 `kubectl apply -f digirunner-open-source.yml`
#### 选项 4:Helm
贡献内容:
- **[how-to-package-digirunner-using-helm](https://github.com/vulcanshen-tpi/how-to-package-digirunner-using-helm)**
- 关于如何使用 Helm 打包 digirunner 开源项目的分步指南。
- 快速安装示例
#### 连接到服务
- 打开浏览器并访问:http://localhost:31080/dgrv4/login
- 使用默认凭据登录:
- 用户名:`manager`
- 密码:`manager123`
### 2. 在本地计算机上即时运行 digiRunner
如果您想**无需安装或设置即可快速试用 digiRunner**,您可以使用我们为您的操作系统预打包的版本。
#### 🧩 步骤 1. 下载安装包
选择您的操作系统并从 [发布页面](https://github.com/TPIsoftwareOSPO/digiRunner-Open-Source/releases/) 下载相应的文件:
- **macOS (ARM64):** [`digirunner-opensource-macos-arm64-vX.X.X.X(version).zip`]
- **Windows (AMD64):** [`digirunner-opensource-windows-amd64-vX.X.X.X(version).zip`]
#### ⚙️ 步骤 2. 解压并运行
1. 解压下载的安装包。
2. 打开解压后的文件夹。
3. 双击 **`quickstart.exe`** 在您的本地计算机上启动 digiRunner。
您现在可以立即开始探索 digiRunner —— 无需安装,无需配置!
#### 🌐 步骤 3. 在浏览器中访问 digiRunner
启动 digiRunner 后,打开浏览器并访问:
👉 [http://localhost:18080/dgrv4/login](http://localhost:18080/dgrv4/login)
使用以下默认凭据登录:
```
username: manager
password: manager123
```
登录后,您就可以开始探索 digiRunner 的管理控制台,并在本地测试其功能。
#### ⚠️ 注意
首次运行该文件时,您可能会收到来自 macOS 或 Windows 的**安全或防火墙警告**。
这是因为我们尚未加入 Apple 或 Microsoft 开发者计划。
#### 🧹 步骤 4. 清理
测试后,您只需**删除整个解压后的文件夹**即可 —— digiRunner 不会在您的系统上修改或安装任何内容。
这个快速入门版本非常适合想要:
- 在几分钟内在本地测试 digiRunner
- 无需设置开销即可探索 API 管理功能
- 在测试后安全地删除所有内容
祝您愉快地体验 digiRunner!💡
### 3. 运行您自己的构建
### 前置条件
- OpenJDK 25
1. 克隆代码仓库:
git clone https://github.com/TPIsoftwareOSPO/digiRunner-Open-Source.git
2. 切换目录:
cd digiRunner-Open-Source/
3. 运行服务:
./gradlew :dgrv4_Gateway_serv:bootRun
4. 等待 digiRunner 的横幅出现。
```
_ ____ _ _
__| | __ _| _ \ _ _ _ __ _ __ ___ _ __ __ __ || |
/ _` |/ _` | |_) | | | | '_ \| '_ \ / _ \ '__| \ \ / / || |_
| (_| | (_| | _ <| |_| | | | | | | | __/ | \ V /|__ _|
\__,_|\__, |_| \_\\__,_|_| |_|_| |_|\___|_| \_/ |_|
|___/
========== dgRv4 web server info ============
...
```
5. 打开浏览器并访问:http://localhost:18080/dgrv4/login
6. 使用默认凭据登录:
- 用户名:`manager`
- 密码:`manager123`
## 创建简单的 API 代理
- [Documentation/create_a_simple_api_proxy](https://docs.tpi.dev/get-started/registering-your-first-apis-with-digirunner)
## 文档
- [文档](https://docs.tpi.dev/)
## 构建您自己的 JAR
1. 切换到 digiRunner 目录:
cd digiRunner/
2. 构建 JAR:
./gradlew :dgrv4_Gateway_serv:clean :dgrv4_Gateway_serv:bootJar
3. 定位 JAR 文件:`dgrv4_Gateway_serv/build/libs/digiRunner-{version}.jar`
4. 运行 JAR:
java -jar dgrv4_Gateway_serv/build/libs/digiRunner-{version}.jar --digiRunner.token.key-store.path=$PWD/dgrv4_Gateway_serv/keys
## 在本地 Container Registry 中运行 digiRunner
### 1. 构建镜像
#### 切换到 digiRunner 目录:
```
cd digiRunner/
```
#### 构建 Docker 镜像:
```
docker build -t digirunner .
```
### 2. 运行容器
```
docker run -p 18080:18080 digirunner
```
打开浏览器并访问:http://localhost:18080/dgrv4/login
## SMART on FHIR 代理
digiRunner 实现了 **HL7 SMART on FHIR STU2.2** 标准,同时充当 **OAuth 2.0 授权服务器**和 FHIR API 资源的**反向代理**。这使医疗保健应用能够跨后端服务器安全地对 FHIR 请求进行身份验证、授权和路由。
### 关键特性
- **SMART App Launch (独立与 EHR 启动)** — 完整的授权码流程,支持 PKCE S256、scope 验证、同意管理和 refresh token 轮换
- **FHIR 反向代理** — 将 `/smart-on-fhir/{proxyName}/*` 请求路由到可配置的后端 FHIR 服务器,包含 URL 重写、安全检查 (SQLi/XSS/XXE) 和 TPS 速率限制
- **客户端身份验证** — 支持 `public`、`client_secret_basic`、`client_secret_post` 和 `private_key_jwt`(根据 RFC 7523 的 client assertion)验证方法
- **分流与粘性路由** — 跨多个后端进行基于概率的流量拆分,通过粘性会话绑定实现资源类型亲和性
- **RS256 JWT token** — Access token 使用 RS256 签名;支持 `id_token` (OIDC)、token 内省 (RFC 7662) 和 JWKS endpoint
- **管理 CRUD API** — 通过管理控制台创建、更新、搜索、删除、导入和导出 SMART Client 和 Proxy 配置
### 授权流程
```
sequenceDiagram
participant App as SMART App
participant DGR as digiRunner Gateway
participant IdP as Built-in IdP
participant FHIR as FHIR Server
Note over App,FHIR: Standalone Launch
App->>DGR: GET .well-known/smart-configuration
DGR-->>App: endpoints, capabilities, scopes
App->>DGR: GET /smart/authorize?aud=&client_id=&scope=&redirect_uri=&code_challenge=S256
DGR-->>IdP: 302 Redirect to IdP login
IdP-->>App: User authenticates
App->>DGR: GET /smart/callback?code=dgRcode
DGR-->>App: 302 to consent page (or direct auth code if autoApprove)
App->>DGR: POST /smart/approve (approved scopes & patient context)
DGR-->>App: 302 ?code=authCode&state=
App->>DGR: POST /smart/token (grant_type=authorization_code + code_verifier)
DGR-->>App: {access_token, id_token, refresh_token, patient, encounter}
App->>DGR: GET /smart-on-fhir/{proxyName}/Patient/123 (Bearer JWT)
DGR->>+FHIR: Forward request (with security checks)
FHIR-->>-DGR: FHIR Resource
DGR-->>App: Rewritten response (URLs updated)
```
### 发现 Endpoint 响应
`.well-known/smart-configuration` endpoint 返回 SMART on FHIR 的能力声明。它通过代理的 URL 路径提供服务:
```
GET http://localhost:18080/smart-on-fhir/{proxyName}/.well-known/smart-configuration
```
```
{
"token_endpoint": "http://localhost:18080/dgrv4/ssotoken/smart/token",
"grant_types_supported": [
"authorization_code",
"client_credentials",
"refresh_token"
],
"capabilities": [
"launch-standalone",
"launch-ehr",
"client-public",
"client-confidential-symmetric",
"client-confidential-asymmetric",
"context-standalone-patient",
"context-ehr-patient",
"context-ehr-encounter",
"permission-patient",
"permission-user",
"permission-v2",
"permission-offline",
"sso-openid-connect"
],
"code_challenge_methods_supported": [
"S256"
],
"issuer": "http://localhost:18080",
"jwks_uri": "http://localhost:18080/dgrv4/ssotoken/smart/jwks",
"authorization_endpoint": "http://localhost:18080/dgrv4/ssotoken/smart/authorize",
"scopes_supported": [
"openid",
"fhirUser",
"profile",
"launch",
"launch/patient",
"launch/encounter",
"patient/*.cruds",
"user/*.cruds",
"system/*.cruds",
"offline_access"
],
"response_types_supported": [
"code"
],
"introspection_endpoint": "http://localhost:18080/dgrv4/ssotoken/smart/introspect",
"revocation_endpoint": "http://localhost:18080/dgrv4/ssotoken/smart/revoke",
"token_endpoint_auth_methods_supported": [
"client_secret_basic",
"client_secret_post",
"private_key_jwt"
]
}
```
### 快速开始
**步骤 1:创建 SMART Client**
在管理 UI 中,导航到 **SMART Client Setting** 并注册一个客户端:
- Client ID、类型 (公开/机密)、允许的 scope (例如 `patient/*.read`, `openid`, `profile`)、重定向 URI、启动模式 (独立/ehr/两者)
**步骤 2:创建 FHIR Proxy**
在 **SMART on FHIR Proxy** 中,创建一个代理配置:
- Proxy 名称 (用于 URL 路径)、后端 FHIR 服务器 URL、分流权重、安全设置 (启用 SQLi/XSS/XXE 检查)、TPS 限制
**步骤 3:配置粘性路由 (可选)**
将特定的 FHIR 源类型绑定到分流目标,以实现会话亲和性。
**步骤 4:获取 Access Token**
使用 SMART App Launch 流程获取 JWT access token,或者对后端服务使用带 client assertion 的 `client_credentials` 授权。
**步骤 5:调用 FHIR 资源**
```
curl -H "Authorization: Bearer " \
http://localhost:18080/smart-on-fhir/{proxyName}/Patient/123
```
## 🏅 社区徽章
我们通过徽章系统来表彰杰出的贡献者。
[初阶徽章](./Badges_Assets/01-First%20Step%20Badge.svg)
[项目构建徽章](./Badges_Assets/02-Project%20Builder%20Badge.svg)
- 📘 [徽章标准](./Badges.md)
- 👑 [徽章获得者](./Community_Badges.md)
## 快速开始
### 1. 使用 Container
选择以下选项之一以通过容器启动服务
#### 选项 1:Docker
```
docker run -it -d -p 31080:18080 tpisoftwareopensource/digirunner-open-source
```
#### 选项 2:Docker-Compose
```
name: digirunner-open-source
services:
dgr:
image: tpisoftwareopensource/digirunner-open-source
ports:
- "31080:18080"
environment:
- TZ=Asia/Taipei
```
- 将上述配置保存为 `opendgr-compose.yml`
- 在与 `opendgr-compose.yml` 相同的目录下运行 `docker-compose -f opendgr-compose.yml up -d`
#### 选项 3:Kubernetes
```
apiVersion: v1
kind: Service
metadata:
name: digirunner-open-source-svc
spec:
ports:
- name: tcp
nodePort: 31080
port: 18080
protocol: TCP
targetPort: 18080
selector:
app: digirunner
sessionAffinity: None
type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: digirunner
name: digirunner-open-source-deploy
spec:
replicas: 1
selector:
matchLabels:
app: digirunner
template:
metadata:
labels:
app: digirunner
namespace: digirunner-open-source-ns
spec:
containers:
- env:
- name: TZ
value: Asia/Taipei
image: tpisoftwareopensource/digirunner-open-source
imagePullPolicy: Always
name: digirunner
ports:
- containerPort: 18080
name: tcp
protocol: TCP
workingDir: /opt/digirunner
```
- 将上述配置保存为 `digirunner-open-source.yml`
- 运行 `kubectl apply -f digirunner-open-source.yml`
#### 选项 4:Helm
贡献内容:
- **[how-to-package-digirunner-using-helm](https://github.com/vulcanshen-tpi/how-to-package-digirunner-using-helm)**
- 关于如何使用 Helm 打包 digirunner 开源项目的分步指南。
- 快速安装示例
#### 连接到服务
- 打开浏览器并访问:http://localhost:31080/dgrv4/login
- 使用默认凭据登录:
- 用户名:`manager`
- 密码:`manager123`
### 2. 在本地计算机上即时运行 digiRunner
如果您想**无需安装或设置即可快速试用 digiRunner**,您可以使用我们为您的操作系统预打包的版本。
#### 🧩 步骤 1. 下载安装包
选择您的操作系统并从 [发布页面](https://github.com/TPIsoftwareOSPO/digiRunner-Open-Source/releases/) 下载相应的文件:
- **macOS (ARM64):** [`digirunner-opensource-macos-arm64-vX.X.X.X(version).zip`]
- **Windows (AMD64):** [`digirunner-opensource-windows-amd64-vX.X.X.X(version).zip`]
#### ⚙️ 步骤 2. 解压并运行
1. 解压下载的安装包。
2. 打开解压后的文件夹。
3. 双击 **`quickstart.exe`** 在您的本地计算机上启动 digiRunner。
您现在可以立即开始探索 digiRunner —— 无需安装,无需配置!
#### 🌐 步骤 3. 在浏览器中访问 digiRunner
启动 digiRunner 后,打开浏览器并访问:
👉 [http://localhost:18080/dgrv4/login](http://localhost:18080/dgrv4/login)
使用以下默认凭据登录:
```
username: manager
password: manager123
```
登录后,您就可以开始探索 digiRunner 的管理控制台,并在本地测试其功能。
#### ⚠️ 注意
首次运行该文件时,您可能会收到来自 macOS 或 Windows 的**安全或防火墙警告**。
这是因为我们尚未加入 Apple 或 Microsoft 开发者计划。
#### 🧹 步骤 4. 清理
测试后,您只需**删除整个解压后的文件夹**即可 —— digiRunner 不会在您的系统上修改或安装任何内容。
这个快速入门版本非常适合想要:
- 在几分钟内在本地测试 digiRunner
- 无需设置开销即可探索 API 管理功能
- 在测试后安全地删除所有内容
祝您愉快地体验 digiRunner!💡
### 3. 运行您自己的构建
### 前置条件
- OpenJDK 25
1. 克隆代码仓库:
git clone https://github.com/TPIsoftwareOSPO/digiRunner-Open-Source.git
2. 切换目录:
cd digiRunner-Open-Source/
3. 运行服务:
./gradlew :dgrv4_Gateway_serv:bootRun
4. 等待 digiRunner 的横幅出现。
```
_ ____ _ _
__| | __ _| _ \ _ _ _ __ _ __ ___ _ __ __ __ || |
/ _` |/ _` | |_) | | | | '_ \| '_ \ / _ \ '__| \ \ / / || |_
| (_| | (_| | _ <| |_| | | | | | | | __/ | \ V /|__ _|
\__,_|\__, |_| \_\\__,_|_| |_|_| |_|\___|_| \_/ |_|
|___/
========== dgRv4 web server info ============
...
```
5. 打开浏览器并访问:http://localhost:18080/dgrv4/login
6. 使用默认凭据登录:
- 用户名:`manager`
- 密码:`manager123`
## 创建简单的 API 代理
- [Documentation/create_a_simple_api_proxy](https://docs.tpi.dev/get-started/registering-your-first-apis-with-digirunner)
## 文档
- [文档](https://docs.tpi.dev/)
## 构建您自己的 JAR
1. 切换到 digiRunner 目录:
cd digiRunner/
2. 构建 JAR:
./gradlew :dgrv4_Gateway_serv:clean :dgrv4_Gateway_serv:bootJar
3. 定位 JAR 文件:`dgrv4_Gateway_serv/build/libs/digiRunner-{version}.jar`
4. 运行 JAR:
java -jar dgrv4_Gateway_serv/build/libs/digiRunner-{version}.jar --digiRunner.token.key-store.path=$PWD/dgrv4_Gateway_serv/keys
## 在本地 Container Registry 中运行 digiRunner
### 1. 构建镜像
#### 切换到 digiRunner 目录:
```
cd digiRunner/
```
#### 构建 Docker 镜像:
```
docker build -t digirunner .
```
### 2. 运行容器
```
docker run -p 18080:18080 digirunner
```
打开浏览器并访问:http://localhost:18080/dgrv4/login
## SMART on FHIR 代理
digiRunner 实现了 **HL7 SMART on FHIR STU2.2** 标准,同时充当 **OAuth 2.0 授权服务器**和 FHIR API 资源的**反向代理**。这使医疗保健应用能够跨后端服务器安全地对 FHIR 请求进行身份验证、授权和路由。
### 关键特性
- **SMART App Launch (独立与 EHR 启动)** — 完整的授权码流程,支持 PKCE S256、scope 验证、同意管理和 refresh token 轮换
- **FHIR 反向代理** — 将 `/smart-on-fhir/{proxyName}/*` 请求路由到可配置的后端 FHIR 服务器,包含 URL 重写、安全检查 (SQLi/XSS/XXE) 和 TPS 速率限制
- **客户端身份验证** — 支持 `public`、`client_secret_basic`、`client_secret_post` 和 `private_key_jwt`(根据 RFC 7523 的 client assertion)验证方法
- **分流与粘性路由** — 跨多个后端进行基于概率的流量拆分,通过粘性会话绑定实现资源类型亲和性
- **RS256 JWT token** — Access token 使用 RS256 签名;支持 `id_token` (OIDC)、token 内省 (RFC 7662) 和 JWKS endpoint
- **管理 CRUD API** — 通过管理控制台创建、更新、搜索、删除、导入和导出 SMART Client 和 Proxy 配置
### 授权流程
```
sequenceDiagram
participant App as SMART App
participant DGR as digiRunner Gateway
participant IdP as Built-in IdP
participant FHIR as FHIR Server
Note over App,FHIR: Standalone Launch
App->>DGR: GET .well-known/smart-configuration
DGR-->>App: endpoints, capabilities, scopes
App->>DGR: GET /smart/authorize?aud=&client_id=&scope=&redirect_uri=&code_challenge=S256
DGR-->>IdP: 302 Redirect to IdP login
IdP-->>App: User authenticates
App->>DGR: GET /smart/callback?code=dgRcode
DGR-->>App: 302 to consent page (or direct auth code if autoApprove)
App->>DGR: POST /smart/approve (approved scopes & patient context)
DGR-->>App: 302 ?code=authCode&state=
App->>DGR: POST /smart/token (grant_type=authorization_code + code_verifier)
DGR-->>App: {access_token, id_token, refresh_token, patient, encounter}
App->>DGR: GET /smart-on-fhir/{proxyName}/Patient/123 (Bearer JWT)
DGR->>+FHIR: Forward request (with security checks)
FHIR-->>-DGR: FHIR Resource
DGR-->>App: Rewritten response (URLs updated)
```
### 发现 Endpoint 响应
`.well-known/smart-configuration` endpoint 返回 SMART on FHIR 的能力声明。它通过代理的 URL 路径提供服务:
```
GET http://localhost:18080/smart-on-fhir/{proxyName}/.well-known/smart-configuration
```
```
{
"token_endpoint": "http://localhost:18080/dgrv4/ssotoken/smart/token",
"grant_types_supported": [
"authorization_code",
"client_credentials",
"refresh_token"
],
"capabilities": [
"launch-standalone",
"launch-ehr",
"client-public",
"client-confidential-symmetric",
"client-confidential-asymmetric",
"context-standalone-patient",
"context-ehr-patient",
"context-ehr-encounter",
"permission-patient",
"permission-user",
"permission-v2",
"permission-offline",
"sso-openid-connect"
],
"code_challenge_methods_supported": [
"S256"
],
"issuer": "http://localhost:18080",
"jwks_uri": "http://localhost:18080/dgrv4/ssotoken/smart/jwks",
"authorization_endpoint": "http://localhost:18080/dgrv4/ssotoken/smart/authorize",
"scopes_supported": [
"openid",
"fhirUser",
"profile",
"launch",
"launch/patient",
"launch/encounter",
"patient/*.cruds",
"user/*.cruds",
"system/*.cruds",
"offline_access"
],
"response_types_supported": [
"code"
],
"introspection_endpoint": "http://localhost:18080/dgrv4/ssotoken/smart/introspect",
"revocation_endpoint": "http://localhost:18080/dgrv4/ssotoken/smart/revoke",
"token_endpoint_auth_methods_supported": [
"client_secret_basic",
"client_secret_post",
"private_key_jwt"
]
}
```
### 快速开始
**步骤 1:创建 SMART Client**
在管理 UI 中,导航到 **SMART Client Setting** 并注册一个客户端:
- Client ID、类型 (公开/机密)、允许的 scope (例如 `patient/*.read`, `openid`, `profile`)、重定向 URI、启动模式 (独立/ehr/两者)
**步骤 2:创建 FHIR Proxy**
在 **SMART on FHIR Proxy** 中,创建一个代理配置:
- Proxy 名称 (用于 URL 路径)、后端 FHIR 服务器 URL、分流权重、安全设置 (启用 SQLi/XSS/XXE 检查)、TPS 限制
**步骤 3:配置粘性路由 (可选)**
将特定的 FHIR 源类型绑定到分流目标,以实现会话亲和性。
**步骤 4:获取 Access Token**
使用 SMART App Launch 流程获取 JWT access token,或者对后端服务使用带 client assertion 的 `client_credentials` 授权。
**步骤 5:调用 FHIR 资源**
```
curl -H "Authorization: Bearer 标签:AI网关, API网关, DLL 劫持, JS文件枚举, 后台面板检测, 域名枚举, 大语言模型, 子域名突变, 流量管理, 请求拦截