auth0 实现的中间件示例
func EnsureValidToken(next http.Handler) http.Handler {
// EnsureValidToken is a middleware that will check the validity of our JWT.
err := godotenv.Load()
if err != nil {
log.Fatal("Error loading .env file")
}
issuerURL, err := url.Parse("https://" + os.Getenv("AUTH0_DOMAIN") + "/")
if err != nil {
log.Fatalf("Failed to parse the issuer url: %v", err)
}
provider := jwks.NewCachingProvider(issuerURL, 5*time.Minute)
jwtValidator, err := validator.New(
provider.KeyFunc,
validator.RS256,
issuerURL.String(),
[]string{os.Getenv("AUTH0_AUDIENCE")},
validator.WithCustomClaims(
func() validator.CustomClaims {
return &CustomClaims{}
},
),
validator.WithAllowedClockSkew(time.Minute),
)
if err != nil {
log.Fatalf("Failed to set up the jwt validator")
}
errorHandler := func(w http.ResponseWriter, r *http.Request, err error) {
log.Printf("Encountered error while validating JWT: %v", err)
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusUnauthorized)
w.Write([]byte(`{"message":"Failed to validate JWT."}`))
}
middleware := jwtmiddleware.New(
jwtValidator.ValidateToken,
jwtmiddleware.WithErrorHandler(errorHandler),
)
return middleware.CheckJWT(next)
}
Run Code Online (Sandbox Code Playgroud)
我正在使用https://docs.go Fiber.io/来处理 HTTP 方法
主功能
func main() {
// This is to translate the net/http -> fiber http
var ensureValidToken = adaptor.HTTPMiddleware(EnsureValidToken)
app := fiber.New()
app.Use(cors.New())
app.Use(logger.New())
// routes
app.Use(ensureValidToken)
app.Get("/api/books", getAll)
app.Listen(":8080")
}
func getAll(c *fiber.Ctx) error {
token := c.Context().Value(jwtmiddleware.ContextKey{}).(*validator.ValidatedClaims)
// The above code will always panic, I'm assuming that it already stored in the context since it passes the validation
}
Run Code Online (Sandbox Code Playgroud)
恐慌的例子
恐慌:接口转换:接口{}为零,而不是*validator.ValidatedClaims
我更深入地研究了 auth0 golang 实现,它确实存储在上下文中,我认为 http.Request 到 Fiber HTTP 之间的转换失败了
r = r.Clone(context.WithValue(r.Context(), ContextKey{}, validToken))
Run Code Online (Sandbox Code Playgroud)
似乎越来越多的人在使用 gofibre 适配器时遇到了同样的问题。其他人解决这个问题的方法是创建他们自己的 HTTPMiddleware 中间件适配器的实现,唯一的变化是他们将上下文设置为 Fiber.Ctx。
您可以在 go Fiber/adaptor github 页面上找到该线程: https: //github.com/go Fiber/adaptor/issues/27#issuecomment-1120428400