適用対象: すべての API Management レベル
この validate-jwt ポリシーは、ID プロバイダーから提供された JSON Web Token (JWT) の存在と有効性を必須にします。 JWT は、指定した HTTP ヘッダーから、または指定したクエリ パラメーターから、あるいは特定の値と照合することで抽出できます。
注
Microsoft Entra から提供された JWT を検証するには、validate-azure-ad-token ポリシーを使用してください。
注
ポリシーの要素と子要素を、ポリシー ステートメントで指定された順序で設定します。 このポリシーの構成に役立つ、ガイド付きのフォーム ベース エディターがポータルに用意されています。 API Management ポリシーを設定または編集する方法について説明します。
ポリシー ステートメント
<validate-jwt
    header-name="name of HTTP header containing the token (alternatively, use query-parameter-name or token-value attribute to specify token)"
    query-parameter-name="name of query parameter used to pass the token (alternative, use header-name or token-value attribute to specify token)"
    token-value="expression returning the token as a string (alternatively, use header-name or query-parameter attribute to specify token)"
    failed-validation-httpcode="HTTP status code to return on failure"
    failed-validation-error-message="error message to return on failure"
    require-expiration-time="true | false"
    require-scheme="scheme"
    require-signed-tokens="true | false"
    clock-skew="allowed clock skew in seconds"
    output-token-variable-name="name of a variable to receive a JWT object representing successfully validated token">
  <openid-config url="full URL of the configuration endpoint, for example, https://login.constoso.com/openid-configuration" />
  <issuer-signing-keys>
    <key id="kid-claim" certificate-id="mycertificate" n="modulus" e="exponent">Base64 encoded signing key</key>
    <!-- if there are multiple keys, then add additional key elements -->
  </issuer-signing-keys>
  <decryption-keys>
    <key certificate-id="mycertificate">Base64 encoded signing key</key>
    <!-- if there are multiple keys, then add additional key elements -->
  </decryption-keys>
  <audiences>
    <audience>audience string</audience>
    <!-- if there are multiple possible audiences, then add additional audience elements -->
  </audiences>
  <issuers>
    <issuer>issuer string</issuer>
    <!-- if there are multiple possible issuers, then add additional issuer elements -->
  </issuers>
  <required-claims>
    <claim name="name of the claim as it appears in the token" match="all | any" separator="separator character in a multi-valued claim">
      <value>claim value as it is expected to appear in the token</value>
      <!-- if there is more than one allowed value, then add additional value elements -->
    </claim>
    <!-- if there are multiple possible allowed claim, then add additional claim elements -->
  </required-claims>
</validate-jwt>
属性
| 属性 | 説明 | 必要 | 既定値 | 
|---|---|---|---|
| header-name | トークンを保持する HTTP ヘッダーの名前。 ポリシー式を使用できます。 | 
              header-name、query-parameter-name、token-value のいずれかを指定する必要があります。 | 
該当なし | 
| query-parameter-name | トークンを保持するクエリ パラメーターの名前。 ポリシー式を使用できます。 | 
              header-name、query-parameter-name、token-value のいずれかを指定する必要があります。 | 
該当なし | 
| token-value | トークンを含む文字列を返す式。 トークン値の一部として Bearer  を返すことはできません。  ポリシー式を使用できます。 | 
              header-name、query-parameter-name、token-value のいずれかを指定する必要があります。 | 
該当なし | 
| failed-validation-httpcode | JWT が検証で不合格となった場合に返す HTTP 状態コード。 ポリシー式を使用できます。 | いいえ | 401 | 
| failed-validation-error-message | JWT が検証で不合格となった場合に HTTP 応答本文で返すエラー メッセージ。 このメッセージ内では、特殊文字を適切にエスケープする必要があります。 ポリシー式を使用できます。 | いいえ | 既定のエラー メッセージは検証の問題によって異なります ("JWT not present" (JWT が存在しません) など)。 | 
| require-expiration-time | ブール型。 トークン内に有効期限クレームが存在する必要があるかどうかを指定します。 ポリシー式を使用できます。 | いいえ | ほんとう | 
| require-scheme | トークン スキームの名前、(例: 「Bearer」)。 この属性が設定されている場合、ポリシーは指定したスキームが承認ヘッダーの値に存在していることを確認します。 ポリシー式を使用できます。 | いいえ | 該当なし | 
| require-signed-tokens | ブール型。 トークンに署名が必要かどうかを指定します。 ポリシー式を使用できます。 | いいえ | ほんとう | 
| clock-skew | 期間。 トークンの発行者と API Management インスタンスのシステム クロックの間に予想される最大時間差を指定するために使用します。 ポリシー式を使用できます。 | いいえ | 0 秒 | 
| output-token-variable-name | 文字列 をオンにします。 成功したトークンの検証において、Jwt 型のオブジェクトとしてトークン値を受け取るコンテキスト変数の名前。 ポリシー式は使用できません。 | 
いいえ | 該当なし | 
要素
| 要素 | 説明 | 必要 | 
|---|---|---|
| openid-config | これらの要素を 1 つ以上追加して、署名キーと発行者を取得可能な準拠している OpenID 構成エンドポイント URL を指定します。 JSON Web Key Set (JWKS) を含む構成は、エンドポイントから 1 時間ごとにプルされ、キャッシュされます。 検証対象のトークンが、キャッシュされた構成に存在しない検証キー ( kid 要求を使用) を参照している場合、または取得に失敗した場合、API Management はエンドポイントから最大 5 分に 1 回プルします。 これらの間隔は予告なしに変更されることがあります。                                                                                                                                              応答は、URL https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata で定義されている仕様に従っている必要があります。 Microsoft Entra ID には、アプリ登録で構成された次のような OpenID Connect のメタデータ エンドポイントを使用します。 - v2 https://login.microsoftonline.com/{tenant-name}/v2.0/.well-known/openid-configuration- v2 マルチテナント  https://login.microsoftonline.com/organizations/v2.0/.well-known/openid-configuration- v1 https://login.microsoftonline.com/{tenant-name}/.well-known/openid-configuration - 顧客テナント (プレビュー) https://{tenant-name}.ciamlogin.com/{tenant-id}/v2.0/.well-known/openid-configuration ディレクトリ テナント名または ID を置き換えます (例: contoso.onmicrosoft.com を {tenant-name} に置き換えます)。 | 
いいえ | 
| issuer-signing-keys | 
              key サブ要素内の、署名付きトークンの検証に使用する base64 でエンコードされたセキュリティ キーの一覧。 セキュリティ キーが複数存在する場合は、すべてのキーが処理される (この場合検証は失敗します) かいずれかのキーの検証が成功する (トークンのロールオーバーに使用されます) まで、各キーについて検証が行われます。 必要に応じて、 id 属性を使用してキーを指定し、トークンの kid クレームに一致させます。 非対称キーで署名付きトークンを検証するには、必要に応じて、API Management にアップロードされた証明書の識別子に設定された値を持つ certificate-id 属性、または Base64url でエンコードされた形式の署名キーの RSA モジュラス n とエクスポーネント e のペアを使用して公開キーを指定します。 | 
いいえ | 
| decryption-keys | 
              key サブ要素内の、トークンの暗号化を解除するために使用される Base64 でエンコードされたキーの一覧。 セキュリティ キーが複数存在する場合は、すべてのキーが処理される (この場合検証は失敗します) かいずれかのキーの検証が成功するまで、各キーについて検証が行われます。非対称キーを使用して暗号化されたトークンの暗号化を解除するには、必要に応じて、API Management にアップロードされた証明書の識別子に設定された値を持つ certificate-id 属性を使用して公開キーを指定します。 | 
いいえ | 
| 観客 | 
              audience サブ要素内の、トークン上に存在する可能性がある、許容される対象ユーザー クレームの一覧。 対象ユーザー値が複数存在する場合は、すべての値が消費される (この場合検証は失敗します) かいずれかの値の検証が成功するまで、各値について検証が行われます。 少なくとも 1 つの対象ユーザーを指定する必要があります。 | 
いいえ | 
| 発行者 | 
              issuer サブ要素内の、トークンを発行した、許容されるプリンシパルの一覧。 発行者の値が複数存在する場合は、すべての値が消費される (この場合検証は失敗します) かいずれかの値の検証が成功するまで、各値について検証が行われます。 | 
いいえ | 
| required-claims | 
              claim サブ要素内の、トークン上に存在すると予測される、有効とみなすクレームの一覧。 複数のクレームが存在する場合、トークンは match 属性の値に従ってクレームの値と一致する必要があります。 | 
いいえ | 
key の属性
| 属性 | 説明 | 必要 | 既定値 | 
|---|---|---|---|
| ID | (発行者の署名キーのみ) 文字列。 JWT で提示される kid クレームを照合するために使用される識別子。 クレームに一致するキーがない場合、API Management は指定された各キーを試行します。 
              RFC で kid クレームの詳細について確認する。 | 
いいえ | 該当なし | 
| 証明書 ID | API Management にアップロードされた証明書エンティティの識別子。非対称キーで署名付きトークンを検証する際に、公開キーを指定するために使用されます。 | いいえ | 該当なし | 
| n | (発行者の署名キーのみ) 非対称キーで署名されたトークンの発行者を検証するために使用される公開キーの剰余。 エクスポーネント e の値を指定する必要があります。 ポリシー式は使用できません。 | 
いいえ | 該当なし | 
| e | (発行者の署名キーのみ) 非対称キーで署名されたトークンの発行者を検証するために使用される公開キーの指数。 モジュラス n の値を指定する必要があります。 ポリシー式は使用できません。 | 
いいえ | 該当なし | 
claim の属性
| 属性 | 説明 | 必要 | 既定値 | 
|---|---|---|---|
| マッチ | 
              match 要素の claim 属性では、検証が成功するためにポリシー内のクレーム値がすべてトークン内に存在する必要があるかどうかを指定します。 次のいずれかの値になります。- all - 検証が成功するには、ポリシー内のクレーム値がすべてトークン内に存在する必要があります。- any - 検証が成功するには、ポリシー内のクレーム値が少なくとも 1 つトークン内に存在する必要があります。 | 
いいえ | 全て | 
| 区切り | 文字列 をオンにします。 複数値を含む要求から一連の値を抽出するために使用する区切り記号を指定します (例: ",")。 | いいえ | 該当なし | 
使用法
- ポリシー セクション: inbound
 - ポリシー スコープ: グローバル、ワークスペース、製品、API、操作
 - ゲートウェイ: クラシック、v2、従量課金、セルフホステッド、ワークスペース
 
使用上の注意
- 
              
validate-jwtポリシーでは、exp属性が指定され、require-expiration-timeに設定されていない限り、false登録済み要求が JWT に含まれている必要があります。 - このポリシーでは、対称と非対称の両方の署名アルゴリズムがサポートされています。
- 
              対称 - A128CBC-HS256、A192CBC-HS384、A256CBC-HS512 の暗号化アルゴリズムがサポートされています。
- このポリシーで使用する場合、キーをポリシー内に Base64 エンコード形式でインライン指定する必要があります。
 
 - 
              非対称 - PS256、RS256、RS512、ES256 の各暗号化アルゴリズムがサポートされています。
- このポリシーで使用する場合、キーは OpenID 構成エンドポイント経由で指定するか、公開キーまたは公開キーのモジュラスとエクスポーネントのペアが含まれる (PFX 形式の) アップロードされた証明書の ID を提供することで指定できます。
 
 
 - 
              対称 - A128CBC-HS256、A192CBC-HS384、A256CBC-HS512 の暗号化アルゴリズムがサポートされています。
 - API Management インスタンスが仮想ネットワークに挿入または統合されている場合は、ポリシーで構成されたすべての OpenID 構成エンドポイント URL にゲートウェイから到達できる必要があります。
 - セルフホステッド ゲートウェイで使用する 1 つ以上の OpenID 構成エンドポイントを使用してポリシーを構成するには、OpenID 構成エンドポイント URL もクラウド ゲートウェイから到達可能である必要があります。
 - さまざまな目的に応じて異なるスコープでアクセス制限ポリシーを使用できます。 たとえば、API 全体を Microsoft Entra 認証を使用して保護するには、
validate-jwtポリシーを API レベルに適用します。または、これを API 操作レベルに適用して、claimsを使用してきめ細かい制御を行うこともできます。 - カスタム ヘッダー (
header-name) を使用する場合、構成済みの必須スキーム (require-scheme) は無視されます。 必要なスキームを使用するには、Authorizationヘッダーに JWT を指定する必要があります。 
例
単純なトークン検証
<validate-jwt header-name="Authorization" require-scheme="Bearer">
    <issuer-signing-keys>
        <key>{{jwt-signing-key}}</key>  <!-- signing key specified as a named value -->
    </issuer-signing-keys>
    <audiences>
        <audience>@(context.Request.OriginalUrl.Host)</audience>  <!-- audience is set to API Management host name -->
    </audiences>
    <issuers>
        <issuer>http://contoso.com/</issuer>
    </issuers>
</validate-jwt>
RSA 証明書を使用したトークン検証
<validate-jwt header-name="Authorization" require-scheme="Bearer">
    <issuer-signing-keys>
        <key certificate-id="my-rsa-cert" />  <!-- signing key specified as certificate ID, enclosed in double-quotes -->
    </issuer-signing-keys>
    <audiences>
        <audience>@(context.Request.OriginalUrl.Host)</audience>  <!-- audience is set to API Management host name -->
    </audiences>
    <issuers>
        <issuer>http://contoso.com/</issuer>
    </issuers>
</validate-jwt>
Microsoft Entra ID シングル テナント トークンの検証
<validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized. Access token is missing or invalid.">
    <openid-config url="https://login.microsoftonline.com/contoso.onmicrosoft.com/.well-known/openid-configuration" />
    <audiences>
        <audience>00001111-aaaa-2222-bbbb-3333cccc4444</audience>
    </audiences>
    <required-claims>
        <claim name="id" match="all">
            <value>insert claim here</value>
        </claim>
    </required-claims>
</validate-jwt>
Microsoft Entra ID 顧客テナント トークンの検証
<validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized. Access token is missing or invalid.">
	<openid-config url="https://<tenant-name>.ciamlogin.com/<tenant-id>/v2.0/.well-known/openid-configuration" />
	<required-claims>
		<claim name="azp" match="all">
			<value>insert claim here</value>
		</claim>
	</required-claims>
</validate-jwt>
Azure Active Directory B2C のトークン検証
<validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized. Access token is missing or invalid.">
    <openid-config url="https://login.microsoftonline.com/tfp/contoso.onmicrosoft.com/b2c_1_signin/v2.0/.well-known/openid-configuration" />
    <audiences>
        <audience>11112222-bbbb-3333-cccc-4444dddd5555</audience>
    </audiences>
    <required-claims>
        <claim name="id" match="all">
            <value>insert claim here</value>
        </claim>
    </required-claims>
</validate-jwt>
Von Bedeutung
2025 年 5 月 1 日より、Azure AD B2C は新規のお客様向けに購入できなくなります。 詳細については、FAQ を参照してください。
解読キーを使用したトークンの検証
この例では、解読キーを使用して解読されたトークンを、validate-jwt ポリシーを使用して検証する方法を示します。 キーは、公開キーを含む、アップロードされた証明書 (PFX 形式) の ID を使用して指定します。
<validate-jwt header-name="Authorization" require-scheme="Bearer" output-token-variable-name="jwt">
    <issuer-signing-keys>
        <key>{{jwt-signing-key}}</key> <!-- signing key is stored in a named value -->
    </issuer-signing-keys>
    <audiences>
        <audience>@(context.Request.OriginalUrl.Host)</audience>
    </audiences>
    <issuers>
        <issuer>contoso.com</issuer>
    </issuers>
    <required-claims>
        <claim name="group" match="any">
            <value>finance</value>
            <value>logistics</value>
        </claim>
    </required-claims>
    <decryption-keys>
        <key certificate-id="my-certificate-in-api-management" /> <!-- decryption key specified as certificate ID -->
    </decryption-keys>
</validate-jwt>
トークン クレームに基づいて操作へのアクセスを承認する
次の例では、validate-jwtポリシーを使用して、トークン クレーム値に基づいて操作へのアクセスを承認する方法を示します。
<validate-jwt header-name="Authorization" require-scheme="Bearer" output-token-variable-name="jwt">
    <issuer-signing-keys>
        <key>{{jwt-signing-key}}</key> <!-- signing key is stored in a named value -->
    </issuer-signing-keys>
    <audiences>
        <audience>@(context.Request.OriginalUrl.Host)</audience>
    </audiences>
    <issuers>
        <issuer>contoso.com</issuer>
    </issuers>
    <required-claims>
        <claim name="group" match="any">
            <value>finance</value>
            <value>logistics</value>
        </claim>
    </required-claims>
</validate-jwt>
<choose>
    <when condition="@(context.Request.Method == "POST" && !((Jwt)context.Variables["jwt"]).Claims["group"].Contains("finance"))">
        <return-response>
            <set-status code="403" reason="Forbidden" />
        </return-response>
    </when>
</choose>
関連ポリシー
関連するコンテンツ
ポリシーに対する処理の詳細については、次のトピックを参照してください。