Files
yunzerwebsiteallinone/go/pkg/jwtutil/jwt_test.go
T
2026-09-19 21:44:04 +08:00

71 lines
1.8 KiB
Go

package jwtutil
import (
"testing"
"time"
)
// TestGenerateParseBackwardCompat 旧签发方式产生的 token 必须仍能被解析(向后兼容)
func TestGenerateParseBackwardCompat(t *testing.T) {
token, err := GenerateToken(1001, "zhangsan", 7, "backend")
if err != nil {
t.Fatalf("GenerateToken 失败: %v", err)
}
claims, err := ParseToken(token)
if err != nil {
t.Fatalf("ParseToken 失败: %v", err)
}
if claims.UserID != 1001 || claims.Username != "zhangsan" || claims.TenantId != 7 || claims.UserType != "backend" {
t.Fatalf("claims 解析不符: %+v", claims)
}
// 旧 token 无认证中心扩展字段
if claims.Sid != "" || claims.ClientID != "" {
t.Fatal("旧 token 不应携带 sid/client_id")
}
}
// TestSignTokenFallback 未配置 RSA 时自动回落 HS256,且可解析
func TestSignTokenFallback(t *testing.T) {
token, err := SignToken(TokenOptions{
Alg: AlgRS256, // 期望回落到 HS256
UserID: 42,
Username: "u",
TenantID: 3,
UserType: "tenant",
ClientID: "crm",
Sid: "sid-001",
Subject: "42",
TTL: 15 * time.Minute,
})
if err != nil {
t.Fatalf("SignToken 失败: %v", err)
}
claims, err := ParseToken(token)
if err != nil {
t.Fatalf("ParseToken 失败: %v", err)
}
if claims.ClientID != "crm" || claims.Sid != "sid-001" || claims.Subject != "42" {
t.Fatalf("扩展 claims 解析不符: %+v", claims)
}
}
// TestParseInvalid 非法 token 必须报错
func TestParseInvalid(t *testing.T) {
if _, err := ParseToken("not-a-token"); err == nil {
t.Fatal("非法 token 应返回错误")
}
if _, err := ParseToken(""); err == nil {
t.Fatal("空 token 应返回错误")
}
}
// TestHasRSA 无配置时不应 panic
func TestHasRSA(t *testing.T) {
if HasRSA() {
t.Log("已配置 RSA 密钥对")
}
if Kid() == "" {
t.Fatal("kid 不应为空")
}
}