package tokens import ( "fmt" "strconv" "strings" "time" "github.com/gin-gonic/gin" "github.com/golang-jwt/jwt" ) var API_SECRET = "wP3-sN6&gG4-lV8>gJ9)" func GenerateToken(user_id uint, unique_Id string, Username string, Account string, EMAIL string) (string, error) { token_lifespan := 100 fmt.Println("GenerateToken user_id :", user_id, EMAIL) claims := jwt.MapClaims{} claims["authorized"] = true claims["user_id"] = user_id claims["unique_Id"] = unique_Id claims["Account"] = Account claims["user_name"] = Username claims["Email"] = EMAIL claims["exp"] = time.Now().Add(time.Hour * time.Duration(token_lifespan)).Unix() token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) tokenString, err := token.SignedString([]byte(API_SECRET)) if err != nil { return "", err } fmt.Println("GenerateToken tokenString :", tokenString) return tokenString, nil } func TokenValid(c *gin.Context) error { tokenString := ExtractToken(c) fmt.Println("TokenValid", tokenString) _, err := jwt.Parse(tokenString, func(token *jwt.Token) (any, error) { if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { fmt.Println(" TokenValid jwt.Parse err ") return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"]) } fmt.Println(" TokenValid(c *gin.Context) ok") return []byte(API_SECRET), nil }) if err != nil { return err } return nil } // 从请求头中获取token func ExtractToken(c *gin.Context) string { bearerToken := c.GetHeader("Authorization") fmt.Println("ExtractToken =>BearerToken: ", bearerToken) if len(strings.Split(bearerToken, " ")) == 2 { return strings.Split(bearerToken, " ")[1] } fmt.Println("格式不正确") return "" } type UserClaims struct { UserId uint UserName string Email string } // 从jwt中解析出user_id func ExtractTokenID(c *gin.Context) (*UserClaims, error) { tokenString := ExtractToken(c) token, err := jwt.Parse(tokenString, func(token *jwt.Token) (any, error) { if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"]) } return []byte(API_SECRET), nil }) if err != nil { return nil, err } claims, ok := token.Claims.(jwt.MapClaims) // 如果jwt有效,将user_id转换为浮点数字符串,然后再转换为 uint32 if ok && token.Valid { uid, err := strconv.ParseUint(fmt.Sprintf("%.0f", claims["user_id"]), 10, 32) userName, ok := claims["user_name"].(string) if !ok { return nil, fmt.Errorf("user_name is not a string") } EMAIL, ok := claims["Email"].(string) if !ok { return nil, fmt.Errorf("Email is not a string") } fmt.Println("userName: ", userName) fmt.Println("EMAIL: ", EMAIL) if err != nil { return nil, err } user := &UserClaims{ UserId: uint(uid), UserName: userName, Email: EMAIL, } return user, nil } return nil, fmt.Errorf("token is invalid") }