2017-07-19 7 views
-3

Ich versuche, jwtauth zu implementieren, aber wenn die Überprüfung Jwtoken aktiviert werden soll, passiert ein seltsamer Fehler.jwtauth.Verifier fail

So, wie im Beispiel bieten sie, wir erzeugen und zurückgeben ein Token auf diese Weise:

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) 
} 
} 

Der jwtauth.Verifier wird erklärt, wie in der doc, globalem Variable.

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()) 
... 

Aber wenn ich versuche, die Routen für den Zugriff innerhalb/Arbeitgeber, ich diesen Fehler:

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 

Ihr Beispiel funktioniert gut, aber die init immer geschieht. Es wird geschrieben, dass das Verify das Token aus der Header-Anfrage als "Authorization" herausnimmt, wenn ich die Verifizierung entferne und den Header überprüfe, der Token + Header-Name vorhanden ist (r.Header.Get ("Authorization"))

Jeder hat eine Idee, wie es funktioniert?

+2

Überprüfen Sie bitte Ihre Fehler. Ein Fehler sollte niemals mit '_' ignoriert werden. – RayfenWindspear

+1

Ihre' loginEmployer'-Funktion ist nicht gültig. Überprüfen Sie, ob Sie den Code korrekt kopiert und veröffentlicht haben. – JimB

Antwort

0

Das Problem, das ich sehe, die ich falsch sein kann, Sie erstellen tokenAuth für jeden Benutzer, der sich anmeldet. Es sollte eine Instanz von tokenAuth geben und Sie codieren und dekodieren mit dieser Instanz. Ich glaube, dass der Zeichenschlüssel für alle Benutzer gleich sein sollte, also können Sie von der tokenAuth-Instanz verifizieren. Sie könnten auch in RS256, wegen der Probleme in der Vergangenheit mit HS256 Unterzeichnung suchen.

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