在Gorilla CustomLoggingHandler中获取JWT数据
我在Go web服务器中使用自定义日志处理程序,如下所示:在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
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
函数中,我制作了自己版本的Gorillahandlers.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(因为我确实可以访问所有的头文件),但这对于日志记录来说似乎是一个很大的开销
有没有更好的方法可以让我在需要的地方访问这些数据