# 认证与安全(JWT + DPoP + Lua 签名)

G2rain 子应用的认证链路由三部分组成:

  1. JWT Token:表达“用户/客户端会话”与“应用范围”信息。
  2. DPoP(Proof-of-Possession):把 Token 绑定到请求,降低被盗用与重放风险。
  3. 应用签名(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