69 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package models
 | 
						||
 | 
						||
import (
 | 
						||
	"errors"
 | 
						||
	"time"
 | 
						||
 | 
						||
	"github.com/golang-jwt/jwt/v5"
 | 
						||
)
 | 
						||
 | 
						||
// JWT密钥
 | 
						||
var jwtSecret = []byte("yunzer_jwt_secret_key") // 在实际应用中应从配置文件读取
 | 
						||
 | 
						||
// Claims 定义JWT的claims结构
 | 
						||
type Claims struct {
 | 
						||
	UserID   int    `json:"user_id"`
 | 
						||
	Username string `json:"username"`
 | 
						||
	TenantId int    `json:"tenant_id"` // 租户ID
 | 
						||
	jwt.RegisteredClaims
 | 
						||
}
 | 
						||
 | 
						||
// GenerateToken 生成JWT token
 | 
						||
func GenerateToken(userID int, username string, tenantId int) (string, error) {
 | 
						||
	// 设置token过期时间
 | 
						||
	expirationTime := time.Now().Add(24 * time.Hour) // 24小时后过期
 | 
						||
 | 
						||
	// 创建claims
 | 
						||
	claims := &Claims{
 | 
						||
		UserID:   userID,
 | 
						||
		Username: username,
 | 
						||
		TenantId: tenantId,
 | 
						||
		RegisteredClaims: jwt.RegisteredClaims{
 | 
						||
			ExpiresAt: jwt.NewNumericDate(expirationTime),
 | 
						||
			IssuedAt:  jwt.NewNumericDate(time.Now()),
 | 
						||
			NotBefore: jwt.NewNumericDate(time.Now()),
 | 
						||
		},
 | 
						||
	}
 | 
						||
 | 
						||
	// 创建token对象,指定签名算法和claims
 | 
						||
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
 | 
						||
 | 
						||
	// 生成签名并获取完整的编码后的字符串token
 | 
						||
	tokenString, err := token.SignedString(jwtSecret)
 | 
						||
 | 
						||
	return tokenString, err
 | 
						||
}
 | 
						||
 | 
						||
// ParseToken 解析JWT token
 | 
						||
func ParseToken(tokenString string) (*Claims, error) {
 | 
						||
	// 解析token
 | 
						||
	claims := &Claims{}
 | 
						||
	token, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) {
 | 
						||
		// 验证签名算法
 | 
						||
		if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
 | 
						||
			return nil, errors.New("unexpected signing method")
 | 
						||
		}
 | 
						||
		return jwtSecret, nil
 | 
						||
	})
 | 
						||
 | 
						||
	if err != nil {
 | 
						||
		return nil, err
 | 
						||
	}
 | 
						||
 | 
						||
	if !token.Valid {
 | 
						||
		return nil, errors.New("invalid token")
 | 
						||
	}
 | 
						||
 | 
						||
	return claims, nil
 | 
						||
}
 |