token.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package tokens
  2. import (
  3. "fmt"
  4. "strconv"
  5. "strings"
  6. "time"
  7. "github.com/gin-gonic/gin"
  8. "github.com/golang-jwt/jwt"
  9. )
  10. var API_SECRET = "wP3-sN6&gG4-lV8>gJ9)"
  11. func GenerateToken(user_id uint, unique_Id string, Username string, Account string, EMAIL string) (string, error) {
  12. token_lifespan := 100
  13. fmt.Println("GenerateToken user_id :", user_id, EMAIL)
  14. claims := jwt.MapClaims{}
  15. claims["authorized"] = true
  16. claims["user_id"] = user_id
  17. claims["unique_Id"] = unique_Id
  18. claims["Account"] = Account
  19. claims["user_name"] = Username
  20. claims["Email"] = EMAIL
  21. claims["exp"] = time.Now().Add(time.Hour * time.Duration(token_lifespan)).Unix()
  22. token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
  23. tokenString, err := token.SignedString([]byte(API_SECRET))
  24. if err != nil {
  25. return "", err
  26. }
  27. fmt.Println("GenerateToken tokenString :", tokenString)
  28. return tokenString, nil
  29. }
  30. func TokenValid(c *gin.Context) error {
  31. tokenString := ExtractToken(c)
  32. fmt.Println("TokenValid", tokenString)
  33. _, err := jwt.Parse(tokenString, func(token *jwt.Token) (any, error) {
  34. if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
  35. fmt.Println(" TokenValid jwt.Parse err ")
  36. return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
  37. }
  38. fmt.Println(" TokenValid(c *gin.Context) ok")
  39. return []byte(API_SECRET), nil
  40. })
  41. if err != nil {
  42. return err
  43. }
  44. return nil
  45. }
  46. // 从请求头中获取token
  47. func ExtractToken(c *gin.Context) string {
  48. bearerToken := c.GetHeader("Authorization")
  49. fmt.Println("ExtractToken =>BearerToken: ", bearerToken)
  50. if len(strings.Split(bearerToken, " ")) == 2 {
  51. return strings.Split(bearerToken, " ")[1]
  52. }
  53. fmt.Println("格式不正确")
  54. return ""
  55. }
  56. type UserClaims struct {
  57. UserId uint
  58. UserName string
  59. Email string
  60. }
  61. // 从jwt中解析出user_id
  62. func ExtractTokenID(c *gin.Context) (*UserClaims, error) {
  63. tokenString := ExtractToken(c)
  64. token, err := jwt.Parse(tokenString, func(token *jwt.Token) (any, error) {
  65. if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
  66. return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
  67. }
  68. return []byte(API_SECRET), nil
  69. })
  70. if err != nil {
  71. return nil, err
  72. }
  73. claims, ok := token.Claims.(jwt.MapClaims)
  74. // 如果jwt有效,将user_id转换为浮点数字符串,然后再转换为 uint32
  75. if ok && token.Valid {
  76. uid, err := strconv.ParseUint(fmt.Sprintf("%.0f", claims["user_id"]), 10, 32)
  77. userName, ok := claims["user_name"].(string)
  78. if !ok {
  79. return nil, fmt.Errorf("user_name is not a string")
  80. }
  81. EMAIL, ok := claims["Email"].(string)
  82. if !ok {
  83. return nil, fmt.Errorf("Email is not a string")
  84. }
  85. fmt.Println("userName: ", userName)
  86. fmt.Println("EMAIL: ", EMAIL)
  87. if err != nil {
  88. return nil, err
  89. }
  90. user := &UserClaims{
  91. UserId: uint(uid),
  92. UserName: userName,
  93. Email: EMAIL,
  94. }
  95. return user, nil
  96. }
  97. return nil, fmt.Errorf("token is invalid")
  98. }