TokenUtil.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package util
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/dgrijalva/jwt-go"
  6. "net/http"
  7. "time"
  8. "github.com/gin-gonic/gin"
  9. )
  10. var secretKey = []byte("my-file-manger") // 用于签名和验证的密钥
  11. const Issuer = "myFileManger"
  12. type MyClaims struct {
  13. Id int64
  14. Role string
  15. jwt.StandardClaims
  16. }
  17. // GenerateToken 创建一个JWT Token
  18. func GenerateToken(id int64, role string) (string, int64, error) {
  19. // 设置token的过期时间
  20. expirationTime := time.Now().Add(72 * time.Hour)
  21. myClaims := &MyClaims{
  22. Id: id,
  23. Role: role,
  24. StandardClaims: jwt.StandardClaims{
  25. ExpiresAt: expirationTime.Unix(),
  26. Issuer: Issuer,
  27. },
  28. }
  29. // 创建token
  30. token := jwt.NewWithClaims(jwt.SigningMethodHS256, myClaims)
  31. // 签名并返回token字符串
  32. signedString, err := token.SignedString(secretKey)
  33. return signedString, expirationTime.UnixMilli(), err
  34. }
  35. // ValidateToken 中间件:验证JWT Token
  36. func ValidateToken() gin.HandlerFunc {
  37. return func(c *gin.Context) {
  38. // 获取请求中的token
  39. tokenString, err := c.Cookie("token")
  40. if err != nil {
  41. c.JSON(http.StatusUnauthorized, gin.H{"code": 401, "msg": "Authorization token is missing"})
  42. c.Abort()
  43. return
  44. }
  45. fmt.Println(tokenString)
  46. if tokenString == "" {
  47. c.JSON(http.StatusUnauthorized, gin.H{"code": 401, "msg": "Authorization token is missing"})
  48. c.Abort()
  49. return
  50. }
  51. // 解析token
  52. token, _ := jwt.ParseWithClaims(tokenString, &MyClaims{}, func(token *jwt.Token) (interface{}, error) {
  53. return secretKey, nil
  54. })
  55. if token == nil || !token.Valid {
  56. c.JSON(http.StatusUnauthorized, gin.H{"code": 401, "msg": "Invalid token"})
  57. c.Abort()
  58. return
  59. }
  60. _, ok := token.Claims.(*MyClaims)
  61. if !ok {
  62. c.JSON(http.StatusUnauthorized, gin.H{"code": 401, "msg": "Invalid token"})
  63. c.Abort()
  64. return
  65. }
  66. c.Next() // Token验证通过,继续执行后续处理
  67. }
  68. }
  69. func ValidateTokenToMyClaims(tokenString string) (*MyClaims, error) {
  70. token, _ := jwt.ParseWithClaims(tokenString, &MyClaims{}, func(token *jwt.Token) (interface{}, error) {
  71. return secretKey, nil
  72. })
  73. if token == nil || !token.Valid {
  74. return nil, errors.New("Invalid token")
  75. }
  76. mc, ok := token.Claims.(*MyClaims)
  77. if !ok {
  78. return nil, errors.New("Invalid token")
  79. }
  80. return mc, nil
  81. }
  82. func ParseJWTWithValidation(tokenString string) (*MyClaims, error) {
  83. // 解析Token
  84. token, err := jwt.ParseWithClaims(tokenString, &jwt.StandardClaims{}, func(token *jwt.Token) (interface{}, error) {
  85. // 使用密钥来验证token
  86. return secretKey, nil
  87. })
  88. if err != nil {
  89. return nil, fmt.Errorf("error parsing token: %v", err)
  90. }
  91. // 断言token为有效类型
  92. if claims, ok := token.Claims.(*MyClaims); ok && token.Valid {
  93. return claims, nil
  94. } else {
  95. return nil, fmt.Errorf("invalid token")
  96. }
  97. }