package utils import ( "encoding/json" "nCovTrack-Backend/global" "nCovTrack-Backend/models" "time" "github.com/gin-gonic/gin" "github.com/golang-jwt/jwt/v4" ) var JWT_KEY = []byte(global.ServerSettings.Jwt.Secret) // GenerateToken Generate token for user // Return: token generated func GenerateToken(claims jwt.MapClaims) string { claims["exp"] = time.Now().Add(15 * 24 * time.Hour).Unix() claims["iat"] = time.Now().Unix() token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) tokenStr, err := token.SignedString(JWT_KEY) if err != nil { panic(err) } return tokenStr } // RenewToken Renew user's token // tokenStr: user request token // Return: // BlankString: token is invalid or token is expired out of allowed time; // OldToken: token is not need to renew; // NewToken: token is renew; func RenewToken(tokenStr string) string { token, err := jwt.Parse(tokenStr, func(t *jwt.Token) (interface{}, error) { return JWT_KEY, nil }) // Token is invalid if err != nil { switch err.(*jwt.ValidationError).Errors { case jwt.ValidationErrorSignatureInvalid: return "" case jwt.ValidationErrorIssuedAt: return "" } } claims := token.Claims.(jwt.MapClaims) expireAt := time.Unix(int64(claims["exp"].(float64)), 0) expireDuration := expireAt.Sub(time.Now()) // Token is out of allow expire duration if expireDuration.Hours() < -float64(global.ServerSettings.Jwt.RenewExpireDays*24) { return "" } // Token not need renew if expireDuration.Hours() > float64(global.ServerSettings.Jwt.RenewAheadDays*24) { return tokenStr } //fmt.Println(expireDuration) claims["exp"] = time.Now().Add(global.TOKEN_EXPIRE_DAYS * 24 * time.Hour).Unix() token = jwt.NewWithClaims(jwt.SigningMethodHS256, claims) tokenStr, err = token.SignedString(JWT_KEY) if err != nil { panic(err) } return tokenStr } func ParseClaims(tokenStr string) jwt.MapClaims { token, err := jwt.Parse(tokenStr, func(t *jwt.Token) (interface{}, error) { return JWT_KEY, nil }) if err != nil { switch err.(*jwt.ValidationError).Errors { case jwt.ValidationErrorSignatureInvalid: return nil case jwt.ValidationErrorIssuedAt: return nil } } return token.Claims.(jwt.MapClaims) } func ClaimsFromHeader(c *gin.Context) models.TokenClaims { var claims models.TokenClaims json.Unmarshal([]byte(c.Request.Header.Get("claims")), &claims) return claims }