Heim  >  Artikel  >  Backend-Entwicklung  >  Azure JWT-Validierung in Go funktioniert nicht

Azure JWT-Validierung in Go funktioniert nicht

WBOY
WBOYnach vorne
2024-02-09 11:12:091008Durchsuche

Go 中的 Azure JWT 验证不起作用

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.

Frageninhalt

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

Problemumgehung

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen