297 lines
7.4 KiB
Go
297 lines
7.4 KiB
Go
|
package jwtx
|
|||
|
|
|||
|
import (
|
|||
|
"fmt"
|
|||
|
"qnc-server/app/main/model"
|
|||
|
"testing"
|
|||
|
"time"
|
|||
|
|
|||
|
"github.com/golang-jwt/jwt/v4"
|
|||
|
"github.com/stretchr/testify/assert"
|
|||
|
)
|
|||
|
|
|||
|
func TestParseJwtToken(t *testing.T) {
|
|||
|
secret := "WUvoIwL-FK0qnlxhvxR9tV6SjfOpeJMpKmY2QvT99lA"
|
|||
|
tokenStr, err := GenerateJwtToken(JwtClaims{
|
|||
|
UserId: 123,
|
|||
|
AgentId: 0,
|
|||
|
Platform: "wxh5",
|
|||
|
UserType: 0,
|
|||
|
IsAgent: 0,
|
|||
|
}, secret, 3600)
|
|||
|
assert.NoError(t, err)
|
|||
|
tests := []struct {
|
|||
|
name string
|
|||
|
tokenStr string
|
|||
|
secret string
|
|||
|
expectError bool
|
|||
|
expectClaims *JwtClaims
|
|||
|
}{
|
|||
|
{
|
|||
|
name: "无效的token字符串",
|
|||
|
tokenStr: "invalid-token",
|
|||
|
secret: secret,
|
|||
|
expectError: true,
|
|||
|
},
|
|||
|
{
|
|||
|
name: "空token字符串",
|
|||
|
tokenStr: "",
|
|||
|
secret: secret,
|
|||
|
expectError: true,
|
|||
|
},
|
|||
|
{
|
|||
|
name: "错误的密钥",
|
|||
|
tokenStr: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHRyYSI6eyJ1c2VySWQiOjEyMywiYWdlbnRJZCI6NDU2LCJwbGF0Zm9ybSI6InRlc3QiLCJ1c2VyVHlwZSI6MSwiaXNBZ2VudCI6MH0sImV4cCI6MTczNTY4MDAwMCwiaWF0IjoxNzM1Njc5OTAwfQ.invalid-signature",
|
|||
|
secret: "wrong-secret",
|
|||
|
expectError: true,
|
|||
|
},
|
|||
|
{
|
|||
|
name: "缺少extra字段",
|
|||
|
tokenStr: createTokenWithoutExtra(secret),
|
|||
|
secret: secret,
|
|||
|
expectError: true,
|
|||
|
},
|
|||
|
{
|
|||
|
name: "正常解析token",
|
|||
|
tokenStr: tokenStr,
|
|||
|
secret: secret,
|
|||
|
expectError: false,
|
|||
|
expectClaims: &JwtClaims{
|
|||
|
UserId: 123,
|
|||
|
AgentId: 456,
|
|||
|
Platform: "test",
|
|||
|
UserType: 1,
|
|||
|
IsAgent: 0,
|
|||
|
},
|
|||
|
},
|
|||
|
{
|
|||
|
name: "解析临时用户token",
|
|||
|
tokenStr: createTempUserToken(secret),
|
|||
|
secret: secret,
|
|||
|
expectError: false,
|
|||
|
expectClaims: &JwtClaims{
|
|||
|
UserId: 789,
|
|||
|
AgentId: 0,
|
|||
|
Platform: "mobile",
|
|||
|
UserType: 0,
|
|||
|
IsAgent: 0,
|
|||
|
},
|
|||
|
},
|
|||
|
{
|
|||
|
name: "解析代理用户token",
|
|||
|
tokenStr: createAgentUserToken(secret),
|
|||
|
secret: secret,
|
|||
|
expectError: false,
|
|||
|
expectClaims: &JwtClaims{
|
|||
|
UserId: 999,
|
|||
|
AgentId: 888,
|
|||
|
Platform: "web",
|
|||
|
UserType: 1,
|
|||
|
IsAgent: 1,
|
|||
|
},
|
|||
|
},
|
|||
|
}
|
|||
|
|
|||
|
for _, tt := range tests {
|
|||
|
t.Run(tt.name, func(t *testing.T) {
|
|||
|
claims, err := ParseJwtToken(tt.tokenStr, tt.secret)
|
|||
|
fmt.Printf("name: %s\n", tt.name)
|
|||
|
fmt.Printf("claims: %+v\n", claims)
|
|||
|
if tt.name == "正常解析token" {
|
|||
|
fmt.Printf("claims.UserType bool: %v\n", claims.UserType == model.UserTypeTemp)
|
|||
|
}
|
|||
|
if tt.expectError {
|
|||
|
assert.Error(t, err)
|
|||
|
assert.Nil(t, claims)
|
|||
|
} else {
|
|||
|
assert.NoError(t, err)
|
|||
|
assert.NotNil(t, claims)
|
|||
|
assert.Equal(t, tt.expectClaims.UserId, claims.UserId)
|
|||
|
assert.Equal(t, tt.expectClaims.AgentId, claims.AgentId)
|
|||
|
assert.Equal(t, tt.expectClaims.Platform, claims.Platform)
|
|||
|
assert.Equal(t, tt.expectClaims.UserType, claims.UserType)
|
|||
|
assert.Equal(t, tt.expectClaims.IsAgent, claims.IsAgent)
|
|||
|
}
|
|||
|
})
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
func TestParseJwtToken_Integration(t *testing.T) {
|
|||
|
secret := "integration-test-secret"
|
|||
|
|
|||
|
// 测试生成和解析的集成
|
|||
|
originalClaims := JwtClaims{
|
|||
|
UserId: 12345,
|
|||
|
AgentId: 67890,
|
|||
|
Platform: "integration-test",
|
|||
|
UserType: 1,
|
|||
|
IsAgent: 1,
|
|||
|
}
|
|||
|
|
|||
|
// 生成token
|
|||
|
tokenStr, err := GenerateJwtToken(originalClaims, secret, 3600)
|
|||
|
assert.NoError(t, err)
|
|||
|
assert.NotEmpty(t, tokenStr)
|
|||
|
|
|||
|
// 解析token
|
|||
|
parsedClaims, err := ParseJwtToken(tokenStr, secret)
|
|||
|
assert.NoError(t, err)
|
|||
|
assert.NotNil(t, parsedClaims)
|
|||
|
|
|||
|
// 验证解析结果
|
|||
|
assert.Equal(t, originalClaims.UserId, parsedClaims.UserId)
|
|||
|
assert.Equal(t, originalClaims.AgentId, parsedClaims.AgentId)
|
|||
|
assert.Equal(t, originalClaims.Platform, parsedClaims.Platform)
|
|||
|
assert.Equal(t, originalClaims.UserType, parsedClaims.UserType)
|
|||
|
assert.Equal(t, originalClaims.IsAgent, parsedClaims.IsAgent)
|
|||
|
}
|
|||
|
|
|||
|
func TestParseJwtToken_EdgeCases(t *testing.T) {
|
|||
|
secret := "edge-case-secret"
|
|||
|
|
|||
|
t.Run("过期的token", func(t *testing.T) {
|
|||
|
// 创建一个已过期的token
|
|||
|
expiredToken := createExpiredToken(secret)
|
|||
|
claims, err := ParseJwtToken(expiredToken, secret)
|
|||
|
assert.Error(t, err)
|
|||
|
assert.Nil(t, claims)
|
|||
|
})
|
|||
|
|
|||
|
t.Run("extra字段为nil", func(t *testing.T) {
|
|||
|
// 创建一个extra字段为nil的token
|
|||
|
nilExtraToken := createTokenWithNilExtra(secret)
|
|||
|
claims, err := ParseJwtToken(nilExtraToken, secret)
|
|||
|
assert.Error(t, err)
|
|||
|
assert.Nil(t, claims)
|
|||
|
})
|
|||
|
|
|||
|
t.Run("extra字段类型错误", func(t *testing.T) {
|
|||
|
// 创建一个extra字段类型错误的token
|
|||
|
wrongTypeToken := createTokenWithWrongExtraType(secret)
|
|||
|
claims, err := ParseJwtToken(wrongTypeToken, secret)
|
|||
|
assert.Error(t, err)
|
|||
|
assert.Nil(t, claims)
|
|||
|
})
|
|||
|
}
|
|||
|
|
|||
|
// 辅助函数:创建有效的token
|
|||
|
func createValidToken(secret string) string {
|
|||
|
now := time.Now().Unix()
|
|||
|
claims := jwt.MapClaims{
|
|||
|
"exp": now + 3600,
|
|||
|
"iat": now,
|
|||
|
"userId": 123,
|
|||
|
ExtraKey: map[string]interface{}{
|
|||
|
"userId": 123,
|
|||
|
"agentId": 456,
|
|||
|
"platform": "test",
|
|||
|
"userType": 1,
|
|||
|
"isAgent": 0,
|
|||
|
},
|
|||
|
}
|
|||
|
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
|
|||
|
tokenStr, _ := token.SignedString([]byte(secret))
|
|||
|
return tokenStr
|
|||
|
}
|
|||
|
|
|||
|
// 辅助函数:创建临时用户token
|
|||
|
func createTempUserToken(secret string) string {
|
|||
|
now := time.Now().Unix()
|
|||
|
claims := jwt.MapClaims{
|
|||
|
"exp": now + 3600,
|
|||
|
"iat": now,
|
|||
|
"userId": 789,
|
|||
|
ExtraKey: map[string]interface{}{
|
|||
|
"userId": 789,
|
|||
|
"agentId": 0,
|
|||
|
"platform": "mobile",
|
|||
|
"userType": 0,
|
|||
|
"isAgent": 0,
|
|||
|
},
|
|||
|
}
|
|||
|
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
|
|||
|
tokenStr, _ := token.SignedString([]byte(secret))
|
|||
|
return tokenStr
|
|||
|
}
|
|||
|
|
|||
|
// 辅助函数:创建代理用户token
|
|||
|
func createAgentUserToken(secret string) string {
|
|||
|
now := time.Now().Unix()
|
|||
|
claims := jwt.MapClaims{
|
|||
|
"exp": now + 3600,
|
|||
|
"iat": now,
|
|||
|
"userId": 999,
|
|||
|
ExtraKey: map[string]interface{}{
|
|||
|
"userId": 999,
|
|||
|
"agentId": 888,
|
|||
|
"platform": "web",
|
|||
|
"userType": 1,
|
|||
|
"isAgent": 1,
|
|||
|
},
|
|||
|
}
|
|||
|
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
|
|||
|
tokenStr, _ := token.SignedString([]byte(secret))
|
|||
|
return tokenStr
|
|||
|
}
|
|||
|
|
|||
|
// 辅助函数:创建缺少extra字段的token
|
|||
|
func createTokenWithoutExtra(secret string) string {
|
|||
|
now := time.Now().Unix()
|
|||
|
claims := jwt.MapClaims{
|
|||
|
"exp": now + 3600,
|
|||
|
"iat": now,
|
|||
|
"userId": 123,
|
|||
|
}
|
|||
|
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
|
|||
|
tokenStr, _ := token.SignedString([]byte(secret))
|
|||
|
return tokenStr
|
|||
|
}
|
|||
|
|
|||
|
// 辅助函数:创建已过期的token
|
|||
|
func createExpiredToken(secret string) string {
|
|||
|
now := time.Now().Unix()
|
|||
|
claims := jwt.MapClaims{
|
|||
|
"exp": now - 3600, // 已过期
|
|||
|
"iat": now - 7200,
|
|||
|
"userId": 123,
|
|||
|
ExtraKey: map[string]interface{}{
|
|||
|
"userId": 123,
|
|||
|
"agentId": 456,
|
|||
|
"platform": "test",
|
|||
|
"userType": 1,
|
|||
|
"isAgent": 0,
|
|||
|
},
|
|||
|
}
|
|||
|
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
|
|||
|
tokenStr, _ := token.SignedString([]byte(secret))
|
|||
|
return tokenStr
|
|||
|
}
|
|||
|
|
|||
|
// 辅助函数:创建extra字段为nil的token
|
|||
|
func createTokenWithNilExtra(secret string) string {
|
|||
|
now := time.Now().Unix()
|
|||
|
claims := jwt.MapClaims{
|
|||
|
"exp": now + 3600,
|
|||
|
"iat": now,
|
|||
|
"userId": 123,
|
|||
|
ExtraKey: nil,
|
|||
|
}
|
|||
|
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
|
|||
|
tokenStr, _ := token.SignedString([]byte(secret))
|
|||
|
return tokenStr
|
|||
|
}
|
|||
|
|
|||
|
// 辅助函数:创建extra字段类型错误的token
|
|||
|
func createTokenWithWrongExtraType(secret string) string {
|
|||
|
now := time.Now().Unix()
|
|||
|
claims := jwt.MapClaims{
|
|||
|
"exp": now + 3600,
|
|||
|
"iat": now,
|
|||
|
"userId": 123,
|
|||
|
ExtraKey: "wrong-type", // 应该是map[string]interface{}
|
|||
|
}
|
|||
|
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
|
|||
|
tokenStr, _ := token.SignedString([]byte(secret))
|
|||
|
return tokenStr
|
|||
|
}
|