jwt.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. package middleware
  2. import (
  3. "fmt"
  4. "github.com/gin-gonic/gin"
  5. "github.com/go-nunu/nunu-layout-advanced/pkg/helper/resp"
  6. "github.com/go-nunu/nunu-layout-advanced/pkg/log"
  7. "github.com/spf13/viper"
  8. "go.uber.org/zap"
  9. "net/http"
  10. "regexp"
  11. )
  12. type JWT struct {
  13. key string
  14. }
  15. type MyCustomClaims struct {
  16. UserId int64
  17. jwt.RegisteredClaims
  18. }
  19. // NewJwt https://pkg.go.dev/github.com/golang-jwt/jwt/v5
  20. func NewJwt(conf *viper.Viper) *JWT {
  21. return &JWT{key: conf.GetString("security.jwt.key")}
  22. }
  23. func (j *JWT) GenToken() string {
  24. token := jwt.NewWithClaims(jwt.SigningMethodHS512, MyCustomClaims{
  25. UserId: 1,
  26. })
  27. // Sign and get the complete encoded token as a string using the key
  28. tokenString, err := token.SignedString(j.key)
  29. fmt.Println(tokenString, err)
  30. return tokenString
  31. }
  32. func (j *JWT) ParseToken(tokenString string) (*MyCustomClaims, error) {
  33. re, _ := regexp.Compile(`(?i)Bearer `)
  34. tokenString = re.ReplaceAllString(tokenString, "")
  35. token, err := jwt.ParseWithClaims(tokenString, &MyCustomClaims{}, func(token *jwt.Token) (interface{}, error) {
  36. return []byte("AllYourBase"), nil
  37. })
  38. if claims, ok := token.Claims.(*MyCustomClaims); ok && token.Valid {
  39. return claims, nil
  40. } else {
  41. return nil, err
  42. }
  43. }
  44. func NoAuth(log *log.Logger) gin.HandlerFunc {
  45. return func(ctx *gin.Context) {
  46. log.WithContext(ctx).Info("建立请求")
  47. ctx.Next()
  48. }
  49. }
  50. // StrictAuth 严格权限
  51. func StrictAuth(j *JWT, log *log.Logger) gin.HandlerFunc {
  52. return func(ctx *gin.Context) {
  53. tokenString := ctx.Request.Header.Get("Authorization")
  54. if tokenString == "" {
  55. log.WithContext(ctx).Warn("请求未携带token,无权限访问", zap.Any("data", map[string]interface{}{
  56. "url": ctx.Request.URL,
  57. "params": ctx.Params,
  58. }))
  59. resp.HandleError(ctx, http.StatusUnauthorized, 1, "no token", nil)
  60. ctx.Abort()
  61. return
  62. }
  63. // parseToken 解析token包含的信息
  64. claims, err := j.ParseToken(tokenString)
  65. if err != nil {
  66. log.WithContext(ctx).Error("token error", zap.Any("data", map[string]interface{}{
  67. "url": ctx.Request.URL,
  68. "params": ctx.Params,
  69. }))
  70. resp.HandleError(ctx, http.StatusUnauthorized, 1, err.Error(), nil)
  71. ctx.Abort()
  72. return
  73. }
  74. // 继续交由下一个路由处理,并将解析出的信息传递下去
  75. ctx.Set("claims", claims)
  76. recoveryLoggerFunc(ctx, log)
  77. ctx.Next()
  78. }
  79. }
  80. func NoStrictAuth(j *JWT, log *log.Logger) gin.HandlerFunc {
  81. return func(ctx *gin.Context) {
  82. tokenString := ctx.Request.Header.Get("Authorization")
  83. if tokenString == "" {
  84. tokenString, _ = ctx.Cookie("accessToken")
  85. }
  86. if tokenString == "" {
  87. tokenString = ctx.Query("accessToken")
  88. }
  89. if tokenString == "" {
  90. log.WithContext(ctx).Info("建立请求")
  91. ctx.Next()
  92. return
  93. }
  94. // parseToken 解析token包含的信息
  95. claims, err := j.ParseToken(tokenString)
  96. if err != nil {
  97. log.WithContext(ctx).Info("建立请求")
  98. ctx.Next()
  99. return
  100. }
  101. // 继续交由下一个路由处理,并将解析出的信息传递下去
  102. ctx.Set("claims", claims)
  103. recoveryLoggerFunc(ctx, log)
  104. ctx.Next()
  105. }
  106. }
  107. func recoveryLoggerFunc(ctx *gin.Context, logger *log.Logger) {
  108. if ctx.Request.URL.Path == "/cos/object" && ctx.Request.Method == "POST" {
  109. return
  110. }
  111. userInfo := ctx.MustGet("claims").(*MyCustomClaims)
  112. logger.NewContext(ctx, zap.Int64("UserId", userInfo.UserId))
  113. logger.WithContext(ctx).Info("建立请求")
  114. // 统计
  115. }