Golang 1.7上下文值nil

时间:2016-09-23 17:17:12

标签: http go jwt middleware

我正在尝试使用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!

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我最终找到了问题。

这两种类型是相同的jwt.Token,但是一种类型来自导入库中的一个出售包,另一种来自我GOPATH中的包。虽然相同的包和类型,Go有一个问题,并且比较这些类型!

要修复,我使用了一个销售工具govendor并运行govendor add +external,这意味着这两个包现在都使用相同的导入

答案 1 :(得分:0)

我的问题是写入上下文的库具有共享库的供应商副本(在上下文中具有键),并且主库也需要供应相同的共享库才能查看关联的值按下键,

作为使用govendor的替代方法,或者如果您使用其他销售方式(我使用gvt),则可以手动删除vondored库已在其内部销售的副本

相关问题