Azure JWT-Validierung in Go funktioniert nicht

WBOY
Freigeben: 2024-02-09 11:12:09
nach vorne
987 Leute haben es durchsucht

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
}
Nach dem Login kopieren

verify2(..) 给出 <nil> 未能匹配任何键 und verify(..) 给出 crypto/rsa: 验证错误

Mein JWT-Header:

{
  "typ": "JWT",
  "nonce": "...",
  "alg": "RS256",
  "x5t": "-KI3Q9nNR7bRofxmeZoXqbHZGew",
  "kid": "-KI3Q9nNR7bRofxmeZoXqbHZGew"
}
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!