From 0c98c5bc15515c02c0d5c6223700a082f5d219e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E8=87=AA=E8=BE=BE?= <980324341@qq.com> Date: Sun, 13 Sep 2026 21:44:20 +0800 Subject: [PATCH] =?UTF-8?q?docs(auth):=20=E4=BF=AE=E6=AD=A3=20JWT=20?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E5=AF=86=E9=92=A5=E6=B3=A8=E9=87=8A=E2=80=94?= =?UTF-8?q?=E2=80=94=E6=A1=8C=E9=9D=A2=E5=AE=A2=E6=88=B7=E7=AB=AF=E6=9C=AC?= =?UTF-8?q?=E5=9C=B0=20Flask=20=E9=80=80=E5=BD=B9=E5=90=8E=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E7=AB=AF=E5=8F=AF=E7=8B=AC=E7=AB=8B=E8=BD=AE=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原注释称"客户端内置同一密钥,服务端不能换"已过时(本地 Flask 与 /api/auth/sync 验签链路已随服务端化退役),会误导运维不敢轮换;2026-09-13 生产已轮换为 application-server.yml 独立密钥并验证。 --- .../com/nanri/aiimage/modules/auth/service/JwtService.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/backend-java/src/main/java/com/nanri/aiimage/modules/auth/service/JwtService.java b/backend-java/src/main/java/com/nanri/aiimage/modules/auth/service/JwtService.java index 6d849529..52937ee0 100644 --- a/backend-java/src/main/java/com/nanri/aiimage/modules/auth/service/JwtService.java +++ b/backend-java/src/main/java/com/nanri/aiimage/modules/auth/service/JwtService.java @@ -35,11 +35,12 @@ public class JwtService { String configured = props.getJwtSecret(); byte[] keyBytes; if (configured == null || configured.isBlank()) { - // 已分发到用户机器的桌面客户端内置同一个默认密钥,服务端必须保持一致, - // 不能随机生成,否则所有旧客户端 /api/auth/sync 验签失败导致无法登录。 + // 兜底:未配置时使用内置默认密钥(公开值,等同无防护,任何人可伪造 token)。 + // 桌面客户端本地 Flask 已退役,服务端可独立轮换密钥;若恢复客户端侧验签, + // 需与客户端同步下发密钥后才能轮换。 keyBytes = INSECURE_DEFAULT_SECRET.getBytes(StandardCharsets.UTF_8); log.warn("[auth] AIIMAGE_JWT_SECRET 未配置,使用内置默认密钥;" - + "生产环境请通过环境变量 AIIMAGE_JWT_SECRET 配置固定密钥(需与桌面客户端一致)"); + + "生产环境请在 application-server.yml 配置 aiimage.auth.jwt-secret"); } else { keyBytes = configured.getBytes(StandardCharsets.UTF_8); }