Files
go_process_manager/utils/jwt.go
liuzhihang1 831ea9889f 初次提交
2024-06-26 20:45:23 +08:00

75 lines
1.9 KiB
Go
Raw 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 utils
import (
"errors"
"time"
"github.com/golang-jwt/jwt"
)
var mySecret = []byte("D9&(#$HI$#Y(FD*A))")
func keyFunc(_ *jwt.Token) (i interface{}, err error) {
return mySecret, nil
}
// MyClaims 自定义声明结构体并内嵌 jwt.StandardClaims
// jwt包自带的jwt.StandardClaims只包含了官方字段若需要额外记录其他字段就可以自定义结构体
// 如果想要保存更多信息,都可以添加到这个结构体中
type MyClaims struct {
UserName string `json:"user_name"`
jwt.StandardClaims
}
func GenToken(UserName string) (string, error) {
// 创建一个我们自己的声明的数据
c := MyClaims{
UserName,
jwt.StandardClaims{
ExpiresAt: time.Now().Add(
240 * time.Hour).Unix(), // 过期时间
Issuer: "jwt", // 签发人
},
}
// 使用指定的签名方法创建签名对象
token := jwt.NewWithClaims(jwt.SigningMethodHS256, c)
// 使用指定的secret签名并获得完整的编码后的字符串token
return token.SignedString(mySecret)
}
// ParseToken 解析JWT
func ParseToken(tokenString string) (*MyClaims, error) {
// 解析token
var mc = new(MyClaims)
token, err := jwt.ParseWithClaims(tokenString, mc, keyFunc)
if err != nil {
return nil, err
}
// 校验token
if token.Valid {
return mc, nil
}
return nil, errors.New("invalid token")
}
// RefreshToken 刷新AccessToken
func RefreshToken(aToken, rToken string) (newAToken, newRToken string, err error) {
// refresh token无效直接返回
if _, err = jwt.Parse(rToken, keyFunc); err != nil {
return
}
// 从旧access token中解析出claims数据
var claims MyClaims
_, err = jwt.ParseWithClaims(aToken, &claims, keyFunc)
v, _ := err.(*jwt.ValidationError)
// 当access token是过期错误 并且 refresh token没有过期时就创建一个新的access token
if v.Errors == jwt.ValidationErrorExpired {
token, _ := GenToken(claims.UserName)
return token, "", nil
}
return
}