57 lines
1.4 KiB
Go
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
|
|
}
|