123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- 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")
- }
|