tasks.md 3.2 KB

1. 签名工具与 Nonce 缓存

  • 1.1 新建 mjava/src/main/java/com/malk/utils/UtilSignature.java:HMAC-SHA256 静态方法 sign(secret, method, path, body, timestamp, nonce) → hex
  • 1.2 新建 mjava/src/main/java/com/malk/core/NonceCache.java:封装 UtilToken.TimedCache,API 为 putIfAbsent(nonce) → boolean
  • 1.3 单元测试:UtilSignatureTest 覆盖不同 method / 空 body / 中文 path
  • 1.4 单元测试:NonceCacheTest 覆盖 TTL 过期 / LRU 淘汰 / 并发

2. 配置与注解

  • 2.1 新建 com.malk.config.AuthConfigProperties@ConfigurationProperties(prefix = "mjava.auth")
  • 2.2 新建 com.malk.config.AuthConfig@Configuration,根据 enabled 与 secret 条件装配)
  • 2.3 新建注解 com.malk.filter.NoAuth@Target({METHOD, TYPE}) @Retention(RUNTIME)
  • 2.4 application.yml 补默认值 mjava.auth.enabled: false
  • 2.5 各子模块 application-*.yml.example 示例 mjava.auth.* 占位

3. Filter + Interceptor 两层

  • 3.1 新建 com.malk.filter.AuthFilter:Header 齐全 + 时间戳窗 + Nonce 去重;失败抛 McException 或直接写 McR.fail() 响应
  • 3.2 注册 AuthFilterWebConfiguration,顺序在 TraceIdFilter 之后、业务之前
  • 3.3 新建 com.malk.filter.AuthInterceptorpreHandle 中签名校验 + @NoAuth 识别
  • 3.4 注册 AuthInterceptorWebMvcConfigurer,排除 exempt-paths
  • 3.5 错误响应统一 McR 格式(见 design.md 错误码表)

4. 审计日志集成

  • 4.1 AuthFilter / AuthInterceptor 失败路径打 WARN 日志,字段:authKey / failReason / clientIp / path / timestamp
  • 4.2 成功路径向 MDC 写 authKeyTraceIdFilter 已有链路串联
  • 4.3 logback-spring.xml pattern 追加 [%X{authKey:-}]

5. 参考客户端实现(文档侧)

  • 5.1 Java 客户端签名示例(工具类形式,便于其他 Java 系统 copy)
  • 5.2 Python 客户端签名示例(requests + hmac
  • 5.3 Node.js 客户端签名示例(node:crypto
  • 5.4 curl + openssl 命令行示例(方便临时调试)

6. 回归测试

  • 6.1 AuthFilterTest:enabled/disabled 切换、Header 缺失、时间窗边界、Nonce 重放
  • 6.2 AuthInterceptorTest@NoAuth 方法级/类级、签名校验、exempt-paths
  • 6.3 集成测试:mjava-mcli 开启后用签名客户端调一次 → 成功;改签名 → 403;改时间戳 → 401
  • 6.4 mcli/shunfeng/guangming 保持 enabled: false 场景回归(零破坏验证)

7. 文档

  • 7.1 /Users/malk/Desktop/Tech/claude/后端/mjava-baseline.md 新增 §13(或合并到 §6)"请求鉴权与防重放"章节,含签名协议与开关
  • 7.2 README.md(本 change 完成后):客户端签名接入指引
  • 7.3 BACKLOG.md 更新专项状态

8. 验证

  • 8.1 openspec validate add-request-auth-replay-guard --strict 通过
  • 8.2 开启 enabled 后用 curl + openssl 跑通一次真实请求
  • 8.3 Nonce 重放测试:同签名连发两次 → 第二次 401

9. 交付

  • 9.1 PR 附签名协议示意图
  • 9.2 走 /opsx:archive