Files
ai_dianshang/server/pkg/jwt/jwt.go
2025-11-17 13:32:54 +08:00

82 lines
1.8 KiB
Go
Raw Permalink 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 (
"dianshang/internal/config"
"errors"
"time"
"github.com/golang-jwt/jwt/v5"
)
// Claims JWT声明结构
type Claims struct {
UserID uint `json:"user_id"`
UserType string `json:"user_type"` // user, admin
jwt.RegisteredClaims
}
var jwtSecret []byte
// Init 初始化JWT
func Init(cfg config.JWTConfig) {
jwtSecret = []byte(cfg.Secret)
}
// GenerateToken 生成JWT token
func GenerateToken(userID uint, userType string, expire int) (string, error) {
nowTime := time.Now()
expireTime := nowTime.Add(time.Duration(expire) * time.Second)
claims := Claims{
UserID: userID,
UserType: userType,
RegisteredClaims: jwt.RegisteredClaims{
ExpiresAt: jwt.NewNumericDate(expireTime),
IssuedAt: jwt.NewNumericDate(nowTime),
NotBefore: jwt.NewNumericDate(nowTime),
Issuer: "dianshang",
},
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
return token.SignedString(jwtSecret)
}
// ParseToken 解析JWT token
func ParseToken(tokenString string) (*Claims, error) {
token, err := jwt.ParseWithClaims(tokenString, &Claims{}, func(token *jwt.Token) (interface{}, error) {
return jwtSecret, nil
})
if err != nil {
return nil, err
}
if claims, ok := token.Claims.(*Claims); ok && token.Valid {
return claims, nil
}
return nil, errors.New("invalid token")
}
// RefreshToken 刷新token
func RefreshToken(tokenString string, expire int) (string, error) {
claims, err := ParseToken(tokenString)
if err != nil {
return "", err
}
// 检查token是否即将过期剩余时间少于30分钟
if time.Until(claims.ExpiresAt.Time) > 30*time.Minute {
return tokenString, nil
}
// 生成新token
return GenerateToken(claims.UserID, claims.UserType, expire)
}
// ValidateToken 验证token有效性
func ValidateToken(tokenString string) bool {
_, err := ParseToken(tokenString)
return err == nil
}