ホームページ >バックエンド開発 >Golang >Go で JWK を使用して JWT 署名を検証する方法

Go で JWK を使用して JWT 署名を検証する方法

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-28 17:00:12958ブラウズ

How to Verify JWT Signatures Using JWKs in Go?

Go で JWK を使用して JWT 署名を検証するにはどうすればよいですか?

JWT を認証する際の課題の 1 つは、署名の検証です。これは、JWK と Go 言語に特に当てはまります。

問題

デコーダーを使用すると、JWT を解析できます。ただし、特に JWK を使用した場合の署名の検証には、別の課題が伴います。一般的なエラーの例を次に示します。

type myClaims struct {
    jwt.StandardClaims
}

func main() {
    claims := &myClaims{}

    _, err := jwt.ParseWithClaims("ey...", claims, getKey)
    if err != nil {
        log.Fatal(err)
    }
}

エラー: キー "kid" がトークン内に見つかりません

解決策

これを解決するには、公開キーを取得する Keyfunc を提供する必要があります。次のコードは、解決策を示しています。

const jwksURL = "https://companyx.okta.com/oauth2/v1/keys"

func getKey(token *jwt.Token) (interface{}, error) {
    // TODO: Cache the response to avoid repeated HTTP requests
    set, err := jwk.FetchHTTP(jwksURL)
    if err != nil {
        return nil, err
    }
    keyID, ok := token.Header["kid"].(string)
    if !ok {
        return nil, errors.New("expecting JWT header to have string kid")
    }
    if key := set.LookupKeyID(keyID); len(key) == 1 {
        return key[0].Materialize()
    }
    return nil, fmt.Errorf("unable to find key %q", keyID)
}

この getKey 関数:

  1. 指定された URL から公開キーを取得します。
  2. キー ID を取得します。 JWT ヘッダー。
  3. キーを使用してキーを検索します。 ID.
  4. キーを jwt-go が検証に使用できるインターフェイスに具体化します。

この getKey 関数を提供することで、Go で JWK を使用して JWT 署名を正常に検証できます。

以上がGo で JWK を使用して JWT 署名を検証する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。