mirror of
				https://github.com/lzh-1625/go_process_manager.git
				synced 2025-10-31 19:32:43 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			75 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 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
 | ||
| }
 | 
