ホームページ  >  記事  >  バックエンド開発  >  Go での Azure JWT 検証が機能しない

Go での Azure JWT 検証が機能しない

WBOY
WBOY転載
2024-02-09 11:12:09966ブラウズ

Go 中的 Azure JWT 验证不起作用

Go 言語を使用して Azure アプリケーションを開発する場合、JWT (JSON Web Token) 検証が機能しないという問題がよく発生します。 JWT は、Web アプリケーション間でクレームを渡すための安全なトランスポート方法ですが、Go で Azure の JWT 検証を使用すると、さまざまな問題が発生することがあります。この記事では、JWT 検証が機能しない考えられる理由をいくつか紹介し、この一般的な問題の解決に役立つ対応する解決策を提供します。この記事は、PHP エディターである Apple によって注意深く編集されたものです。お役に立てば幸いです。

質問内容

go httpサーバーを使用しています。 Azure JWT トークンを使用してルートを保護したいと考えています。トークンを生成できますが、検証できません。

これが私がやったことです:

リーリー

verify2(..)2d77b2345c34a631c3d251f57ce68620 がどのキーとも一致しませんでした を返し、そして verify(..)crypto/rsa: 検証エラーが発生します

私の 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
}

回避策

間違った種類の Azure AD アクセス トークンを使用しています。 JWT ヘッダーに nonce を含むコンテンツは、独自の API によって検証されることを目的としたものではなく、Microsoft 独自の API を対象としています。

この問題を解決するには API スコープを公開する必要があります。その後、JWT ヘッダーのノンスなしのアクセス トークンを取得できるようになります。私の ブログ投稿 には、さらに関連する情報がいくつかあります。

以上がGo での Azure JWT 検証が機能しないの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。