Files
LokiStack/backend/pkg/jwt/jwt_test.go
T
Logan.LiandClaude 327e282356 refactor: 前后端目录结构模块化 + v2 优化移植与缺陷修复
前端:
- src/srv/api → src/api,按域分文件夹(auth/cluster/host/storage/deployment/collector)
- 新增 http.ts 引擎(http.get/post/put/delete),域模块改用语义化调用
- index.html 增加 favicon(匹配应用 logo 的 emerald + Activity 脉冲)

后端分层增强(保留包名):
- 新增 repository/:从 models 拆出 JsonDB 持久化层(InitDB/GetDB/Shutdown/RequestSave)
- 新增 dto/:从 controllers 抽出各域请求契约(带 binding 校验)
- 新增 pkg/crypto、pkg/jwt:从 utils 拆出安全原语(外部 jwt 别名 jwtv5 避免冲突)
- models 只留领域实体 + sanitizer;utils 只留 gin/应用相关(response/errors)

v2 优化移植与缺陷修复:
- 移植密钥分离/SSH TOFU/并发写安全/Loki 生产级配置/Docker 加固
- 修复 deployment.go 并发丢更新、Helm values 重复键、EncryptField 哨兵、loki-gateway 端点等审计缺陷
- 实现真正的优雅关停(main.go http.Server + signal + repository.Shutdown)
- 修复登录契约:后端返回 accessToken,前端 auth.ts/Login.tsx 对齐
- 补 crypto/jwt/repository 单元测试(含并发写回归)

验证: go build/vet/test 全绿;npm run build 通过;登录→鉴权→优雅关停冒烟通过

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-30 10:46:26 +08:00

67 lines
2.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package jwt
import (
"testing"
jwtv5 "github.com/golang-jwt/jwt/v5"
)
// TestTokenPairRoundTrip 覆盖签发 + 解析,并校验 access token 类型。
func TestTokenPairRoundTrip(t *testing.T) {
pair, err := GenerateTokenPair(42, "alice", "admin")
if err != nil {
t.Fatalf("GenerateTokenPair: %v", err)
}
if pair.AccessToken == "" || pair.RefreshToken == "" {
t.Fatal("tokens must not be empty")
}
claims, err := ParseToken(pair.AccessToken)
if err != nil {
t.Fatalf("ParseToken(access): %v", err)
}
if claims.UserID != 42 || claims.Username != "alice" || claims.Role != "admin" {
t.Fatalf("unexpected claims: %+v", claims)
}
if claims.TokenType != "access" {
t.Fatalf("access token should have tokenType=access, got %q", claims.TokenType)
}
}
// TestRefreshRequiresRefreshToken 覆盖 token 类型强制:
// 用 access token 刷新必须被拒;用 refresh token 刷新应成功。
func TestRefreshRequiresRefreshToken(t *testing.T) {
pair, _ := GenerateTokenPair(1, "bob", "user")
if _, err := RefreshAccessToken(pair.AccessToken); err == nil {
t.Fatal("RefreshAccessToken must reject access tokens")
}
newPair, err := RefreshAccessToken(pair.RefreshToken)
if err != nil {
t.Fatalf("RefreshAccessToken(refresh): %v", err)
}
if newPair.AccessToken == "" {
t.Fatal("new access token must not be empty")
}
}
// TestParseTokenRejectsBogus 解析任意非 JWT 字符串必须失败。
func TestParseTokenRejectsBogus(t *testing.T) {
if _, err := ParseToken("not-a-jwt"); err == nil {
t.Fatal("ParseToken must reject bogus token")
}
}
// TestParseTokenRejectsNoneAlgo 覆盖算法混淆攻击防护:
// ParseToken 的 keyfunc 仅接受 HMAC,alg=none 构造的 token 必须被拒。
func TestParseTokenRejectsNoneAlgo(t *testing.T) {
tok := jwtv5.NewWithClaims(jwtv5.SigningMethodNone, Claims{UserID: 1, TokenType: "access"})
unsigned, err := tok.SigningString()
if err != nil {
t.Fatal(err)
}
bogus := unsigned + "." // alg=none 的无签名形式
if _, err := ParseToken(bogus); err == nil {
t.Fatal("ParseToken must reject alg=none (algorithm confusion)")
}
}