Heim > Artikel > Backend-Entwicklung > Azure JWT-Validierung in Go funktioniert nicht
Bei der Entwicklung von Azure-Anwendungen mit der Go-Sprache stoßen wir häufig auf das Problem, dass die JWT-Überprüfung (JSON Web Token) nicht funktioniert. JWT ist eine sichere Transportmethode zum Übergeben von Ansprüchen zwischen Webanwendungen. Bei der Verwendung der JWT-Validierung von Azure in Go treten jedoch manchmal verschiedene Probleme auf. In diesem Artikel werden einige mögliche Gründe vorgestellt, warum die JWT-Überprüfung nicht funktioniert, und entsprechende Lösungen bereitgestellt, die Ihnen bei der Lösung dieses häufigen Problems helfen. Dieser Artikel wurde vom PHP-Editor Apple sorgfältig zusammengestellt und ich hoffe, dass er Ihnen hilfreich sein wird.
Ich habe einen Go-HTTP-Server. Ich möchte meine Routen mit dem Azure JWT-Token sichern. Ich kann das Token generieren, es aber nicht verifizieren.
Das ist, was ich mache:
package main import ( "context" "errors" "fmt" "github.com/dgrijalva/jwt-go" "github.com/lestrrat-go/jwx/jwa" "github.com/lestrrat-go/jwx/jwk" njwt "github.com/lestrrat-go/jwx/jwt" ) const token = "<access-token>" const jwksurl = `https://login.microsoftonline.com/common/discovery/keys` func main() { set, _ := jwk.fetch(context.todo(), jwksurl) // verified that set has required kid verify2(token, set) token, err := verify(token, set) // token, err := jwt.parse(token, getkey) if err != nil { panic(err) } claims := token.claims.(jwt.mapclaims) for key, value := range claims { fmt.printf("%s\t%v\n", key, value) } } func verify2(token string, keyset jwk.set) { btoken := []byte(token) parsedtoken, err := njwt.parse( btoken, //token is a []byte njwt.withkeyset(keyset), njwt.withvalidate(true), ) fmt.printf("%v %v", parsedtoken, err) } func verify(tokenstring string, keyset jwk.set) (*jwt.token, error) { tkn, err := jwt.parse(tokenstring, func(token *jwt.token) (interface{}, error) { if token.method.alg() != jwa.rs256.string() { return nil, fmt.errorf("unexpected signing method: %v", token.header["alg"]) } kid, ok := token.header["kid"].(string) if !ok { return nil, errors.new("kid header not found") } keys, ok := keyset.lookupkeyid(kid) if !ok { return nil, fmt.errorf("key %v not found", kid) } var raw interface{} err := keys.raw(&raw) return raw, err }) return tkn, err }
verify2(..)
给出 2d77b2345c34a631c3d251f57ce68620 未能匹配任何键
und
verify(..)
给出 crypto/rsa: 验证错误
Mein JWT-Header:
{ "typ": "JWT", "nonce": "...", "alg": "RS256", "x5t": "-KI3Q9nNR7bRofxmeZoXqbHZGew", "kid": "-KI3Q9nNR7bRofxmeZoXqbHZGew" }
Sie verwenden den falschen Typ von Azure AD-Zugriffstoken. Inhalte mit Nonces in JWT-Headern sollen nicht von Ihrer eigenen API überprüft werden – sie sind für die eigene API von Microsoft gedacht.
Sie müssen einen API-Bereich freigeben, um dieses Problem zu beheben. Anschließend erhalten Sie ein Zugriffstoken ohne die Nonce im JWT-Header. Mein Blogbeitrag enthält einige weitere relevante Informationen.
Das obige ist der detaillierte Inhalt vonAzure JWT-Validierung in Go funktioniert nicht. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!