首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何获得jwt、auth0和gofiber的解码令牌?

如何获得jwt、auth0和gofiber的解码令牌?
EN

Stack Overflow用户
提问于 2022-08-21 06:39:19
回答 2查看 437关注 0票数 5

https://auth0.com/docs/quickstart/webapp/nextjs/01-login

  • and successfully

  • on使用next.js auth0和一个自定义的golang后端,在后端获得解码令牌时遇到了困难。在我遵循本教程的前端,

  • The中间件已经成功地验证了令牌

来自auth0实现的示例中间件

代码语言:javascript
运行
复制
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)
}

示例令牌

我使用https://docs.gofiber.io/来处理HTTP方法

主要功能

代码语言:javascript
运行
复制
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
}

恐慌示例

恐慌:接口转换:接口{}为零,而不是*validator.ValidatedClaims

我深入研究了auth0的实现,它确实存储在上下文中,我认为http.Request到fiber之间的转换失败了

代码语言:javascript
运行
复制
r = r.Clone(context.WithValue(r.Context(), ContextKey{}, validToken))
EN

回答 2

Stack Overflow用户

发布于 2022-08-24 12:57:11

似乎有更多的人在使用光纤适配器时也面临着同样的问题。其他人解决的方法是创建自己的HTTPMiddleware中间件适配器的实现,唯一的改变就是将上下文设置为fiber.Ctx。

您可以在go纤/适配器github页面上找到一个线程:https://github.com/gofiber/adaptor/issues/27#issuecomment-1120428400

票数 0
EN

Stack Overflow用户

发布于 2022-08-26 15:42:08

我在gin框架中也遇到了同样的恐慌,我通过将代码片段更改为c.Request.Context().Value()来解决恐慌错误,但这在光纤框架中是不可用的。如果您想要解码的jwt令牌,可以从光纤上下文的标头中获取它,并在控制器内对其进行适当的解码,并将从标头获得的令牌传递给下面的函数和解码。

代码语言:javascript
运行
复制
import (
        extract "github.com/golang-jwt/jwt"
        "fmt"
        )
func Extractor(tokenString string) {
    token, _, err := new(extract.Parser).ParseUnverified(tokenString, extract.MapClaims{})
    if err != nil {
        fmt.Printf("Error %s", err)
    }
    if claims, ok := token.Claims.(extract.MapClaims); ok {
        // obtains claims
        subId := fmt.Sprint(claims["sub"])
        fmt.Println(subId)
    }
}

然后实现您的逻辑,并将所需的值传递给下一个处理程序。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73432197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档