Maison  >  Article  >  développement back-end  >  La validation Azure JWT dans Go ne fonctionne pas

La validation Azure JWT dans Go ne fonctionne pas

WBOY
WBOYavant
2024-02-09 11:12:09966parcourir

Go 中的 Azure JWT 验证不起作用

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.

Contenu de la question

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

Solution de contournement

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer