Apabila membangunkan aplikasi Azure menggunakan bahasa Go, kami sering menghadapi masalah bahawa pengesahan JWT (JSON Web Token) tidak berfungsi. JWT ialah kaedah pengangkutan selamat untuk menghantar tuntutan antara aplikasi web, tetapi kadangkala anda menghadapi pelbagai isu apabila menggunakan pengesahan JWT Azure dalam Go. Artikel ini akan memperkenalkan anda kepada beberapa kemungkinan sebab pengesahan JWT tidak berfungsi dan menyediakan penyelesaian yang sepadan untuk membantu anda menyelesaikan masalah biasa ini. Artikel ini telah disusun dengan teliti oleh editor PHP Apple, dan saya harap ia akan membantu anda.
Saya mempunyai pelayan http go. Saya ingin memastikan laluan saya menggunakan token jwt azure. Saya dapat menjana token tetapi tidak dapat mengesahkannya.
Ini yang saya buat:
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(..)
给出 <nil> 未能匹配任何键
dan
verify(..)
给出 crypto/rsa: 验证错误
Tajuk jwt saya:
{ "typ": "JWT", "nonce": "...", "alg": "RS256", "x5t": "-KI3Q9nNR7bRofxmeZoXqbHZGew", "kid": "-KI3Q9nNR7bRofxmeZoXqbHZGew" }
Anda menggunakan jenis token akses Azure AD yang salah. Kandungan dengan nonces dalam pengepala JWT tidak bertujuan untuk disahkan oleh API anda sendiri - ia bertujuan untuk API Microsoft sendiri.
Anda perlu mendedahkan skop API untuk menyelesaikan isu ini, selepas itu anda akan mendapat token akses tanpa nonce dalam pengepala JWT. catatan blog saya mempunyai beberapa maklumat lanjut yang berkaitan.
Atas ialah kandungan terperinci Pengesahan Azure JWT dalam Pergi tidak berfungsi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!