71 lines
1.8 KiB
Go
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 不应为空")
|
|
}
|
|
}
|