https://auth0.com/docs/quickstart/webapp/nextjs/01-login
。
来自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)
}
示例令牌
我使用https://docs.gofiber.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
}
恐慌示例
恐慌:接口转换:接口{}为零,而不是*validator.ValidatedClaims
我深入研究了auth0的实现,它确实存储在上下文中,我认为http.Request到fiber之间的转换失败了
r = r.Clone(context.WithValue(r.Context(), ContextKey{}, validToken))
发布于 2022-08-24 12:57:11
似乎有更多的人在使用光纤适配器时也面临着同样的问题。其他人解决的方法是创建自己的HTTPMiddleware中间件适配器的实现,唯一的改变就是将上下文设置为fiber.Ctx。
您可以在go纤/适配器github页面上找到一个线程:https://github.com/gofiber/adaptor/issues/27#issuecomment-1120428400
发布于 2022-08-26 15:42:08
我在gin框架中也遇到了同样的恐慌,我通过将代码片段更改为c.Request.Context().Value()
来解决恐慌错误,但这在光纤框架中是不可用的。如果您想要解码的jwt令牌,可以从光纤上下文的标头中获取它,并在控制器内对其进行适当的解码,并将从标头获得的令牌传递给下面的函数和解码。
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)
}
}
然后实现您的逻辑,并将所需的值传递给下一个处理程序。
https://stackoverflow.com/questions/73432197
复制相似问题