Maison >développement back-end >Golang >La validation Azure JWT dans Go ne fonctionne pas
Lors du développement d'applications Azure à l'aide du langage Go, nous rencontrons souvent le problème que la vérification JWT (JSON Web Token) ne fonctionne pas. JWT est une méthode de transport sécurisée permettant de transmettre des revendications entre des applications Web, mais vous rencontrez parfois divers problèmes lors de l'utilisation de la validation JWT d'Azure dans Go. Cet article vous présentera quelques raisons possibles pour lesquelles la vérification JWT ne fonctionne pas et vous proposera les solutions correspondantes pour vous aider à résoudre ce problème courant. Cet article a été soigneusement compilé par l'éditeur PHP Apple, et j'espère qu'il vous sera utile.
J'ai un serveur http actif. Je souhaite sécuriser mon itinéraire à l'aide du jeton Azure JWT. Je suis capable de générer le jeton mais je ne peux pas le vérifier.
Voici ce que je fais :
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 未能匹配任何键
et
verify(..)
给出 crypto/rsa: 验证错误
Mon en-tête jwt :
{ "typ": "JWT", "nonce": "...", "alg": "RS256", "x5t": "-KI3Q9nNR7bRofxmeZoXqbHZGew", "kid": "-KI3Q9nNR7bRofxmeZoXqbHZGew" }
Vous utilisez le mauvais type de jeton d'accès Azure AD. Le contenu comportant des noms occasionnels dans les en-têtes JWT n'est pas destiné à être vérifié par votre propre API : il est destiné à la propre API de Microsoft.
Vous devez exposer une étendue d'API pour résoudre ce problème, après quoi vous obtiendrez un jeton d'accès sans le nom occasionnel dans l'en-tête JWT. Mon article de blog contient d'autres informations pertinentes.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!