go zero jwt校验错误不走handler error

444 阅读1分钟

go zero jwt校验错误不走handler error

rest.MustNewServer​中添加rest.WithUnauthorizedCallback​,调用httpx.error即可,然后在httpx.SetErrorHandler​自定义相关错误

参考:github.com/zeromicro/g…

package main

import (
  "context"
  "flag"
  "fmt"
  "github.com/golang-jwt/jwt/v4"
  "github.com/zeromicro/go-zero/core/conf"
  "github.com/zeromicro/go-zero/core/logx"
  "github.com/zeromicro/go-zero/rest"
  "github.com/zeromicro/go-zero/rest/httpx"
  "gozeroApi/internal/common/errorz"
  "gozeroApi/internal/config"
  "gozeroApi/internal/handler"
  "gozeroApi/internal/svc"
  "net/http"
  "reflect"
)

var configFile = flag.String("f", "etc/gozeroapi-api.yaml", "the config file")

func main() {
  flag.Parse()

  var c config.Config
  conf.MustLoad(*configFile, &c)


  server := rest.MustNewServer(c.RestConf, rest.WithUnauthorizedCallback(func(w http.ResponseWriter, r *http.Request, err error) {
    httpx.Error(w, err)
  }))
  defer server.Stop()
  // 自定义错误返回信息内容
  httpx.SetErrorHandler(func(err error) (int, interface{}) {
    logx.Debug("error type:", reflect.TypeOf(err).String())
    switch e := err.(type) {
    case *errorz.CodeError:
      return e.Code, e.ErrorData()
    case *jwt.ValidationError:
      return 400, &errorz.CodeErrorResponse{
        Code: 400,
        Msg:  err.Error(),
      }
    default:
      return 402, &errorz.CodeErrorResponse{
        Code: 402,
        Msg:  err.Error(),
      }
    }
  })
  httpx.SetErrorHandlerCtx(func(ctx context.Context, err error) (int, interface{}) {
    switch e := err.(type) {
    case *errorz.CodeError:
      return e.Code, e.ErrorData()
    default:
      return 402, nil
    }
  })
  ctx := svc.NewServiceContext(c)
  handler.RegisterHandlers(server, ctx)
  fmt.Printf("Starting server at %s:%d...\n", c.Host, c.Port)
  server.Start()
}