TokenUtil.go 2.2 KB

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