2017-07-19 22 views
-3

jwtauthを実装しようとしていますが、jwtokenの検証が有効になっていると奇妙なエラーが発生します。だから、jwtauth.Verifier fail

、それらが提供する例のように、我々はこの方法を生成し、トークンを返す:

func (s *Service) loginEmployer(w http.ResponseWriter, r *http.Request) { 
u := &User{} 

    hashed, err := bcrypt.GenerateFromPassword([]byte(r.FormValue("password")), 8) 
    if err != nil { 
     panic(err) 
    } 

    tokenAuth = jwtauth.New("HS256", []byte(hashed), nil) 
    _, tokenString, _ := tokenAuth.Encode(jwtauth.Claims{"login": r.FormValue("login")}) 
    u.TokenString = tokenString 
    WriteJSON(w, u, 200) 
} else { 
    http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized) 
} 
} 

jwtauth.Verifierはドキュメント、グローバル変数のように宣言されています。

var tokenAuth *jwtauth.JwtAuth 

func routes(s *Service) *chi.Mux { 
// Private access login 
r.Group(func(r chi.Router) { 
    r.Use(jwtauth.Verifier(tokenAuth)) 
    r.Use(jwtauth.Authenticator) 
    r.Mount("/employer", employerRoutes()) 
... 

しかし、私は/雇用者内のルートにアクセスしようと、 私はこのエラーを取得する:

2017/07/19 18:16:22 http: panic serving 127.0.0.1:59856: runtime error: invalid memory address or nil pointer dereference 
goroutine 15 [running]: 
net/http.(*conn).serve.func1(0xc420019680) 
    /usr/lib/go-1.8/src/net/http/server.go:1721 +0xd0 
panic(0x7f9620, 0xa64510) 
    /usr/lib/go-1.8/src/runtime/panic.go:489 +0x2cf 
github.com/go-chi/jwtauth.(*JwtAuth).Decode(0x0, 0xc420192707, 0x67, 0x6, 0x6e, 0x0) 
    /home/antiaskid/go/src/github.com/go-chi/jwtauth/jwtauth.go:168 +0x40 
github.com/go-chi/jwtauth.VerifyRequest(0x0, 0xc4201aa400, 0xc420180b10, 0x1, 0x1, 0x0, 0x1, 0xc420180f30) 
    /home/antiaskid/go/src/github.com/go-chi/jwtauth/jwtauth.go:124 +0x154 
github.com/go-chi/jwtauth.Verify.func1.1(0xa40920, 0xc4201a8380, 0xc4201aa400) 
    /home/antiaskid/go/src/github.com/go-chi/jwtauth/jwtauth.go:79 +0x89 
net/http.HandlerFunc.ServeHTTP(0xc4201ae5c0, 0xa40920, 0xc4201a8380, 0xc4201aa400) 
    /usr/lib/go-1.8/src/net/http/server.go:1942 +0x44 
github.com/go-chi/chi.(*ChainHandler).ServeHTTP(0xc4201ae600, 0xa40920, 0xc4201a8380, 0xc4201aa400) 
    /home/antiaskid/go/src/github.com/go-chi/chi/chain.go:29 +0x52 
github.com/go-chi/chi.(*Mux).routeHTTP(0xc420192150, 0xa40920, 0xc4201a8380, 0xc4201aa400) 
    /home/antiaskid/go/src/github.com/go-chi/chi/mux.go:415 +0x26d 
github.com/go-chi/chi.(*Mux).(github.com/go-chi/chi.routeHTTP)-fm(0xa40920, 0xc4201a8380, 0xc4201aa400) 
    /home/antiaskid/go/src/github.com/go-chi/chi/mux.go:351 +0x48 
net/http.HandlerFunc.ServeHTTP(0xc4201808a0, 0xa40920, 0xc4201a8380, 0xc4201aa400) 
    /usr/lib/go-1.8/src/net/http/server.go:1942 +0x44 
main.(*Service).sessionMiddleware.func1(0xa40920, 0xc4201a8380, 0xc4201aa300) 
    /home/antiaskid/go/src/bitbucket.org/victoria/middlewares.go:17 +0x148 
net/http.HandlerFunc.ServeHTTP(0xc4201824e0, 0xa40920, 0xc4201a8380, 0xc4201aa300) 
    /usr/lib/go-1.8/src/net/http/server.go:1942 +0x44 
github.com/go-chi/chi.(*Mux).ServeHTTP(0xc420192150, 0xa40920, 0xc4201a8380, 0xc42000b000) 
    /home/antiaskid/go/src/github.com/go-chi/chi/mux.go:80 +0x1df 
net/http.serverHandler.ServeHTTP(0xc4201980b0, 0xa40920, 0xc4201a8380, 0xc42000b000) 
    /usr/lib/go-1.8/src/net/http/server.go:2568 +0x92 
net/http.(*conn).serve(0xc420019680, 0xa41020, 0xc420017300) 
    /usr/lib/go-1.8/src/net/http/server.go:1825 +0x612 
created by net/http.(*Server).Serve 
    /usr/lib/go-1.8/src/net/http/server.go:2668 +0x2ce 

彼らの例が正常に動作しますが、initは常に起こっています。検証を削除し、ヘッダーをチェックすると、トークン+ヘッダー名が存在することを確認します(r.Header.Get( "Authorization"))

どのように動作させるか考えている人はいますか?

+2

エラーを確認してください。エラーは '_によって無視されるべきではありません。 – RayfenWindspear

+1

' loginEmployer'関数が有効ではありません。コードを正しくコピーして投稿したことを確認してください。 – JimB

答えて

0

私が間違っているかもしれない問題は、ログインしている各ユーザーのtokenAuthを作成していることです。tokenAuthのインスタンスが1つあり、そのインスタンスを使用してエンコードおよびデコードする必要があります。署名キーはすべてのユーザーで同じでなければならないと思いますので、tokenAuthインスタンスから確認できます。過去にHS256で問題があったために、RS256で署名することも検討してください。

https://auth0.com/blog/brute-forcing-hs256-is-possible-the-importance-of-using-strong-keys-to-sign-jwts/