在使用Go語言開發Azure應用程式時,經常會遇到JWT(JSON Web Token)驗證不起作用的問題。 JWT是一種用於在網路應用程式間傳遞聲明的安全傳輸方式,但有時在Go中使用Azure的JWT驗證時會遇到各種問題。本文將為您介紹一些可能導致JWT驗證不起作用的原因,並提供相應的解決方案,幫助您解決這個常見的問題。本文經過php小編蘋果精心整理,希望對您有幫助。
我有一個 go http 伺服器。我想使用 azure jwt 令牌保護我的路由。我能夠生成令牌,但無法驗證它。
我就是這樣做的:
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 未能匹配任何鍵
和
verify(..)
給出 crypto/rsa: 驗證錯誤
#我的 jwt 標頭:
{ "typ": "JWT", "nonce": "...", "alg": "RS256", "x5t": "-KI3Q9nNR7bRofxmeZoXqbHZGew", "kid": "-KI3Q9nNR7bRofxmeZoXqbHZGew" }
您使用的 Azure AD 存取權杖類型錯誤。 JWT 標頭中帶有隨機數的內容並非旨在由您自己的 API 進行驗證 - 它們適用於 Microsoft 自己的 API。
您需要公開一個 API 範圍來解決此問題,之後您將獲得一個存取令牌,而 JWT 標頭中沒有隨機數。我的部落格文章有一些進一步的相關資訊。
以上是Go 中的 Azure JWT 驗證不起作用的詳細內容。更多資訊請關注PHP中文網其他相關文章!