# 认证与安全(JWT + DPoP + Lua 签名)
G2rain 子应用的认证链路由三部分组成:
- JWT Token:表达“用户/客户端会话”与“应用范围”信息。
- DPoP(Proof-of-Possession):把 Token 绑定到请求,降低被盗用与重放风险。
- 应用签名(Lua):通过 OpenResty Lua 在网关侧完成“应用身份”签名与校验。
# JWT Token 生命周期
Token 中包含关键字段(示例):
interface Token {
clientId: string;
clientPublicKey: string;
applicationCodes: string[];
expireAt: number;
refreshExpireAt: number;
}
前端侧使用 useAccessTokenStore(Pinia)管理:
- 独立运行:可持久化到
localStorage qiankun子应用模式:由主应用管理 Token,不持久化(避免跨应用冲突)
# DPoP(Demonstrating Proof-of-Possession)
DPoP 用于证明客户端持有私钥,并将请求的“方法/URI/载荷哈希”绑定到签名中,从而防重放。
常见字段包括:
interface DpopPayload {
htu: string; // 请求 URL
htm: string; // HTTP method
acd: string; // applicationCode
pha: string; // Payload Hash Algorithm
jti: string; // 唯一请求 ID(防重放)
iat: number;
exp: number; // 通常较短(如 5 分钟)
}
在前端实现上,HTTP 请求拦截器会在需要时为请求构建并附加 DPoP 头。
# Lua 应用身份签名
应用签名用于证明“调用方应用”的身份,由后端 OpenResty Lua 脚本处理。典型流程:
- 前端调用 Lua 签名 API(携带 DPoP)
- 网关转发给 Lua
- Lua 验证 DPoP 后,使用应用私钥生成签名结果返回给前端/后续链路使用
对应的脚本通常位于:
lua/sign.lua(签名核心)lua/sign_api.lua(签名 API 入口)lua/config.lua(密钥/配置管理)
# 你可以怎么继续
- 想看权限模型:
/architecture/resource-permission.html - 想看资源初始化 Boot:
/architecture/boot-resource.html