如何获取 jwt auth0 和 go Fiber 的解码令牌?

air*_*eak 5 go auth0 go-fiber

  1. 我使用 next.js auth0 和自定义 golang api 后端,但在后端获取解码令牌时遇到问题。
  2. 在前端方面,我遵循了本教程 - https://auth0.com/docs/quickstart/webapp/nextjs/01-login
  3. 我成功地将 accessToken 发送到我的后端 API
  4. 在后端,我遵循了本教程 - https://auth0.com/docs/quickstart/backend/golang/01-authorization
  5. 中间件已成功验证令牌

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)

kne*_*tsi 0

似乎越来越多的人在使用 gofibre 适配器时遇到了同样的问题。其他人解决这个问题的方法是创建他们自己的 HTTPMiddleware 中间件适配器的实现,唯一的变化是他们将上下文设置为 Fiber.Ctx。

您可以在 go Fiber/adaptor github 页面上找到该线程: https: //github.com/go Fiber/adaptor/issues/27#issuecomment-1120428400