在Gorilla CustomLoggingHandler中获取JWT数据

在Gorilla CustomLoggingHandler中获取JWT数据,go,logging,jwt,gorilla,Go,Logging,Jwt,Gorilla,我在Go web服务器中使用自定义日志处理程序,如下所示: func main() { // ... Set up everything router = mux.NewRouter() router.Handle("/apilookup", raven.Recoverer( jwtMiddleware.Handler( http.HandlerFunc( d

我在Go web服务器中使用自定义日志处理程序,如下所示:

func main() {
    // ... Set up everything

    router = mux.NewRouter()
    router.Handle("/apilookup",
        raven.Recoverer(
            jwtMiddleware.Handler(
                http.HandlerFunc(
                    doApiLookup)))).Methods("GET")

    loggedRouter := handlers.CustomLoggingHandler(os.Stdout, router, writeLog)

    http.ListenAndServe(listenAddr, loggedRouter)
}
writeLog
函数中,我制作了自己版本的Gorilla
handlers.LoggingHandler
,其中记录了大量附加信息

我想做的一件事是记录用户的身份验证请求。用户使用
JWT
(使用
Authorization:Bearer…
头)对此服务器进行身份验证。我使用Auth0解析令牌并在请求的上下文中设置其值

我试图根据中间件的文档记录用户的电子邮件地址(JWT中的一项声明),如下所示:

func writeLog(writer io.Writer, params handlers.LogFormatterParams) {

    // ... SNIP

    // If we can't identify the user
    username := "-"

    if userJwt := params.Request.Context().Value("user"); userJwt != nil {
        claims := userJwt.(*jwt.Token).Claims.(*jwtClaims)
        username = claims.Email
    }

    // ... SNIP
}
问题是,
username
始终是初始值
-
,而不是JWT的预期值

通过在
if
上方添加
log.Printf(“%+v\n”,params.Request.Context())
,我发现
上下文实际上并不包含解析的JWT数据

据我所知,这不起作用的原因是中间件使用更新的上下文创建了一个新的
请求
,因此只有链下游的中间件才能看到它。因为日志中间件位于JWT中间件之上,所以它没有相同的上下文

我知道我可以在日志处理程序中重新解析JWT(因为我确实可以访问所有的头文件),但这对于日志记录来说似乎是一个很大的开销

有没有更好的方法可以让我在需要的地方访问这些数据