2025-04-30 15:46:14 +08:00

57 lines
1.4 KiB
Go

package tokenlib
import (
"admin/internal/errcode"
"fmt"
"github.com/golang-jwt/jwt/v5"
"strconv"
"time"
)
type RegisteredTokenClaims struct {
User string `json:"user,omitempty"`
jwt.RegisteredClaims
}
var (
tokenSign = []byte("token_sign") // token加盐
)
func ValidToken(token string, userId int) error {
checkToken, err := jwt.ParseWithClaims(token, &RegisteredTokenClaims{}, func(token *jwt.Token) (interface{}, error) {
return tokenSign, nil
})
if err != nil {
return errcode.New(errcode.TokenInvalid, "ParseWithClaims token (%v) error:%v", token, err)
}
if !checkToken.Valid {
return errcode.New(errcode.TokenInvalid, "ParseWithClaims token (%v) invalid", token)
}
claims := checkToken.Claims.(*RegisteredTokenClaims)
if claims.User != strconv.Itoa(userId) {
return errcode.New(errcode.TokenInvalid, "token:%v extract user:%v not equal header give id:%v", token, claims.User, userId)
}
return nil
}
func GenToken(userId int, expire time.Duration) (string, error) {
user := strconv.Itoa(userId)
claims := &RegisteredTokenClaims{
User: user,
}
jwtClaims := jwt.RegisteredClaims{
ExpiresAt: jwt.NewNumericDate(time.Now().Add(expire)),
Issuer: "test",
}
claims.RegisteredClaims = jwtClaims
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
ss, err := token.SignedString(tokenSign)
if err != nil {
return "", fmt.Errorf("token SignedString error:%v", err)
}
return ss, nil
}