😅

Cloud Run単体でIAPを構成した場合のJWT検証Audienceについて

に公開

概要

App EngineのようにCloud RunでもLBを間に挟まずともIdentity Aware Proxy (IAP)を構成することが可能になりました。

https://blog.g-gen.co.jp/entry/using-iap-with-cloud-run

IAPを通過すると、HTTPヘッダーにx-goog-iap-jwt-assertionというヘッダーが追加されます。
このx-goog-iap-jwt-assertionヘッダーを検証することで、IAPを通過したユーザーのユーザーIDやemailを取得することも可能です。

https://docs.cloud.google.com/iap/docs/signed-headers-howto?hl=ja

本記事では、Cloud Run単体でIAPを構成した場合のx-goog-iap-jwt-assertionヘッダーの検証のAudience指定で詰まったポイントについて紹介します。

x-goog-iap-jwt-assertionヘッダー (JWT) の検証

x-goog-iap-jwt-assertionヘッダーの検証する公式のプログラムの例 (Python) を示します。
validate_iap_jwt関数の引数には、x-goog-iap-jwt-assertionヘッダーから取得したJWTとaudienceが指定されています。
引数から取得した値を用いて、JWTの検証を行います。
検証が問題なく完了することで、x-goog-iap-jwt-assertionヘッダーからuser_idやemailを取得することが可能です。

from google.auth.transport import requests
from google.oauth2 import id_token


def validate_iap_jwt(iap_jwt, expected_audience):
    """Validate an IAP JWT.

    Args:
      iap_jwt: The contents of the X-Goog-IAP-JWT-Assertion header.
      expected_audience: The Signed Header JWT audience. See
          https://cloud.google.com/iap/docs/signed-headers-howto
          for details on how to get this value.

    Returns:
      (user_id, user_email, error_str).
    """

    try:
        decoded_jwt = id_token.verify_token(
            iap_jwt,
            requests.Request(),
            audience=expected_audience,
            certs_url="https://www.gstatic.com/iap/verify/public_key",
        )
        return (decoded_jwt["sub"], decoded_jwt["email"], "")
    except Exception as e:
        return (None, None, f"**ERROR: JWT validation error {e}**")

検証時のAudienceは何を指定すれば良いか

前述したvalidate_iap_jwt関数では引数にaudienceを指定する必要がありました。
audienceの役割としては、JWTの受信者を識別することです。
https://datatracker.ietf.org/doc/html/rfc7519#section-4.1.3

App EngineやGKEの場合、公式ドキュメントに記載されている通り、以下のaudienceを指定すれば良さそうです。

https://cloud.google.com/iap/docs/signed-headers-howto?hl=ja

しかし、今回利用しているCloud Runに単体でIAPを構成した場合のaudienceについての解説はありませんでした。

Deep Researchで調べてみる

Cloud Runに単体でIAPを構成した場合のaudienceがパッと調べた限り見当たらなかったので、Deep Researchにお願いして調べてもらいました。

調べてもらったところ、/projects/PROJECT_NUMBER/locations/REGION/services/SERVICE_NAME形式で良いとのことですが、参考文献として示していただいているドキュメントにはそれらの記載は見当たりませんでした。

解決策: 英語のドキュメントを見よう (n回目)

結論、英語版のドキュメントにはしっかりとCloud Runのaudienceも記載されていました。
Deep Research同様、/projects/PROJECT_NUMBER/locations/REGION/services/SERVICE_NAMEでした。
※ 2025年11月4日時点では、日本語版のドキュメントに反映されていないようです。

英語版
https://docs.cloud.google.com/iap/docs/signed-headers-howto?hl=en

日本語版
https://docs.cloud.google.com/iap/docs/signed-headers-howto?hl=ja

まとめ

  • 本記事ではCloud Run単体でIAPを構成した際のx-goog-iap-jwt-assertionヘッダーの検証に必要なaudienceについて紹介しました。
  • 改めて自分自身への戒めとなりますが、Google Cloudの場合、日本語ドキュメントと英語ドキュメントに違いがあることが多々あるので、英語ドキュメントを読もうと思いました。

Discussion