我正在尝试使用Go的1.7上下文包实现JWT(JSON Web令牌)中间件,但我遇到了一个检索早期设置上下文值的奇怪错误。
鉴于代码..
func JWTAuthenticator(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
jwtToken, _ := ctx.Value("jwt").(*jwt.Token)
fmt.Printf("ctx = %+v\n", ctx)
fmt.Printf("ctx = %+v\n", jwtToken)
// Token is authenticated, pass it through
next.ServeHTTP(w, r)
})
}
返回..
context.Background.WithValue(&http.contextKey{name:"http-server"}, &http.Server{Addr:":8080", Handler:(*chi.Mux)(0xc4201ec180), ReadTimeout:0, WriteTimeout:0, TLSConfig:(*tls.Config)(0xc420210000), MaxHeaderBytes:0, TLSNextProto:map[string]func(*http.Server, *tls.Conn, http.Handler){"h2-14":(func(*http.Server, *tls.Conn, http.Handler))(0xb8410), "h2":(func(*http.Server, *tls.Conn, http.Handler))(0xb8410)}, ConnState:(func(net.Conn, http.ConnState))(nil), ErrorLog:(*log.Logger)(nil), disableKeepAlives:0, nextProtoOnce:sync.Once{m:sync.Mutex{state:0, sema:0x0}, done:0x1}, nextProtoErr:error(nil)}).WithValue(&http.contextKey{name:"local-addr"}, &net.TCPAddr{IP:net.IP{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, Port:8080, Zone:""}).WithCancel.WithCancel.WithValue(&chi.contextKey{name:"RouteContext"}, &chi.Context{URLParams:chi.params(nil), RoutePath:"", RoutePattern:"/store", RoutePatterns:[]string{"/store"}}).WithValue(0, "us2-ldn-barlow/XJoT7aahzI-000001").WithValue("jwt", &jwt.Token{Raw:"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdG9yZV9pZCI6NzA4MDJ9.eT70KOJbS4JJrsMC76KH4IPRozPt-ipjMDUSuAUhB4k", Method:(*jwt.SigningMethodHMAC)(0xc420133d80), Header:map[string]interface {}{"alg":"HS256", "typ":"JWT"}, Claims:map[string]interface {}{"store_id":70802}, Signature:"eT70KOJbS4JJrsMC76KH4IPRozPt-ipjMDUSuAUhB4k", Valid:true}).WithValue("jwt.err", <nil>)
ctx = <nil>
你可以做的包括一个值.WithValue(&#34; jwt&#34;)但是返回nil!
有什么想法吗?
答案 0 :(得分:1)
我最终找到了问题。
这两种类型是相同的jwt.Token
,但是一种类型来自导入库中的一个出售包,另一种来自我GOPATH中的包。虽然相同的包和类型,Go有一个问题,并且比较这些类型!
要修复,我使用了一个销售工具govendor
并运行govendor add +external
,这意味着这两个包现在都使用相同的导入
答案 1 :(得分:0)
我的问题是写入上下文的库具有共享库的供应商副本(在上下文中具有键),并且主库也需要供应相同的共享库才能查看关联的值按下键,
作为使用govendor
的替代方法,或者如果您使用其他销售方式(我使用gvt
),则可以手动删除vondored库已在其内部销售的副本>