在使用Go語言開發(fā)Azure應用程序時,經(jīng)常會遇到JWT(JSON Web Token)驗證不起作用的問題。JWT是一種用于在網(wǎng)絡應用間傳遞聲明的安全傳輸方式,但有時在Go中使用Azure的JWT驗證時會遇到各種問題。本文將為您介紹一些可能導致JWT驗證不起作用的原因,并提供相應的解決方案,幫助您解決這個常見的問題。本文經(jīng)過php小編蘋果精心整理,希望對您有所幫助。
問題內(nèi)容
我有一個 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 = ""
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(..) 給出 未能匹配任何鍵 和
verify(..) 給出 crypto/rsa: 驗證錯誤
我的 jwt 標頭:
{
"typ": "JWT",
"nonce": "...",
"alg": "RS256",
"x5t": "-KI3Q9nNR7bRofxmeZoXqbHZGew",
"kid": "-KI3Q9nNR7bRofxmeZoXqbHZGew"
}
登錄后復制
解決方法
您使用的 Azure AD 訪問令牌類型錯誤。 JWT 標頭中帶有隨機數(shù)的內(nèi)容并非旨在由您自己的 API 進行驗證 – 它們適用于 Microsoft 自己的 API。
您需要公開一個 API 范圍來解決此問題,之后您將獲得一個訪問令牌,而 JWT 標頭中沒有隨機數(shù)。我的博客文章有一些進一步的相關信息。






