VerifyAPIKey ポリシー

このページの内容は ApigeeApigee ハイブリッドに該当します。

Apigee Edge のドキュメントを表示する。

ポリシー アイコン

概要

Verify API Key ポリシーによって、ランタイムに API キーを検証でき、承認済みの API キーを持つアプリのみが API にアクセスできるようになります。このポリシーを有効にすることにより、API キーが有効で失効していないことを確認できるほか、API プロダクトに関連する特定のリソースの利用を承認されていることを確認できます。

このポリシーは拡張可能なポリシーであり、Apigee ライセンスによっては、このポリシーの使用によって費用や使用率に影響する場合があります。ポリシータイプと使用量への影響については、ポリシータイプをご覧ください。

Verify API Key ポリシーを使用する API プロキシの構築方法を示すチュートリアルについては、API キーを要求して API を保護するをご覧ください。

サンプル

クエリ パラメータのキー

<VerifyAPIKey name="APIKeyVerifier">
    <APIKey ref="request.queryparam.apikey" />
</VerifyAPIKey>

この例では、ポリシーは request.queryparam.apikey というフロー変数で API キーを見つけることを想定しています。変数 request.queryparam.{name} は、クライアント リクエストで渡されたクエリ パラメータの値が入力される標準の Apigee フロー変数です。

次の curl コマンドは、API キーをクエリ パラメータで渡します。

curl http://myorg-test.apigee.net/mocktarget?apikey=IEYRtW2cb7A5Gs54A1wKElECBL65GVls

ヘッダー内のキー

<VerifyAPIKey name="APIKeyVerifier">
    <APIKey ref="request.header.x-apikey" />
</VerifyAPIKey>

この例では、ポリシーは request.header.x-apikey というフロー変数で API キーを見つけることを想定しています。変数 request.header.{name} は、クライアント リクエストで渡されたヘッダーの値が入力される標準の Apigee フロー変数です。

次の cURL は、ヘッダーで API キーを渡す方法を示しています。

curl "http://myorg-test.apigee.net/mocktarget" -H "x-apikey:IEYRtW2cb7A5Gs54A1wKElECBL65GVls"

変数内のキー

<VerifyAPIKey name="APIKeyVerifier">
    <APIKey ref="requestAPIKey.key"/>
</VerifyAPIKey>

このポリシーは、キーを含む任意の変数を参照できます。この例のポリシーは、requestAPIKey.key という名前の変数から API キーを抽出します。

その変数の入力の方法は自分で決めることが可能です。たとえば、次のように、Extract Variables ポリシーを使用して requestAPIKey.keymyKey という名前のクエリ パラメータから入力できます。

<ExtractVariables async="false" continueOnError="false" enabled="true" name="SetAPIKeyVar">
    <Source>request</Source>
    <QueryParam name="myKey">
        <Pattern ignoreCase="true">{key}</Pattern>
    </QueryParam>
    <VariablePrefix>requestAPIKey</VariablePrefix>
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
</ExtractVariables>

アクセス ポリシーフロー変数

<AssignMessage async="false" continueOnError="false" enabled="true" name="accessverifyvars">
    <AssignVariable>
        <Name>devFirstName</Name>
        <Ref>verifyapikey.verify-api-key.developer.firstName</Ref>
        <Value>ErrorOnCopy</Value>
    </AssignVariable>
    <AssignVariable>
        <Name>devLastName</Name>
        <Ref>verifyapikey.verify-api-key.developer.lastName</Ref>
        <Value>ErrorOnCopy</Value>
    </AssignVariable>
    <AssignVariable>
        <Name>devEmail</Name>
        <Ref>verifyapikey.verify-api-key.developer.email</Ref>
        <Value>ErrorOnCopy</Value>
    </AssignVariable>
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
    <AssignTo createNew="false" transport="http" type="request"/>
</AssignMessage>

有効な API キーの Verify API Key ポリシーを実行すると、Apigee は自動的に一連のフロー変数に値を入力します。これらの変数を使用すると、アプリ名、アプリ ID、アプリを登録したデベロッパーまたは会社に関する情報などにアクセスできます。上記の例では、Verify API Key ポリシーを実行した後に、Assign Message ポリシーを使用して、デベロッパーのファースト ネーム、ラストネーム、メールアドレスにアクセスします。

これらの変数にはすべて、次の接頭辞が付けられます。

verifyapikey.{policy_name}

この例では、Verify API キーのポリシー名は「verify-api-key」です。したがって、変数 verifyapikey.verify-api-key.developer.firstName. にアクセスして、リクエストを行うデベロッパーのファースト ネームを参照します。

Apigee について学ぶ


Verify API Key ポリシーの概要

デベロッパーが Apigee にアプリを登録すると、Apigee はコンシューマのキーとシークレットのペアを自動的に生成します。アプリのコンシューマのキーとシークレットのペアを Apigee UI で表示したり、Apigee API からアクセスしたりできます。

アプリ登録時に、デベロッパーはアプリに関連付ける 1 つ以上の API プロダクトを選択します。ここで API プロダクトは、API プロキシを介してアクセスできるリソースのコレクションです。次に、デベロッパーは、リクエストのたびにその一環として API キー(コンシューマ キー)を、アプリに関連付けられている API プロダクトの API に渡します。詳しくはパブリッシャーの概要をご覧ください。

API キーは認証トークンとして使用することも、OAuth アクセス トークンを取得するために使用することもできます。OAuth では、API キーは「クライアント ID」と呼びます。これらの名前は同じ意味で使用できます。詳しくは、OAuth ホームをご覧ください。

Verify API Key ポリシーを実行すると、Apigee は自動的に一連のフロー変数を設定します。詳しくは、下記のフロー変数をご覧ください。

要素リファレンス

このポリシーで構成できる要素と属性は次のとおりです。

<VerifyAPIKey async="false" continueOnError="false" enabled="true" name="Verify-API-Key-1">
    <DisplayName>Custom label used in UI</DisplayName>
    <APIKey ref="variable_containing_api_key"/>
    <CacheExpiryInSeconds ref="request.queryparam.cache_expiry">Default value</CacheExpiryInSeconds/>
</VerifyAPIKey>

<VerifyAPIKey> 属性

次の例は、<VerifyAPIKey> タグの属性を示しています。

<VerifyAPIKey async="false" continueOnError="false" enabled="true" name="Verify-API-Key-1">

次の表に、すべてのポリシーの親要素に共通する属性を示します。

属性 説明 デフォルト 要否
name

ポリシーの内部名。name 属性の値には、英字、数字、スペース、ハイフン、アンダースコア、ピリオドを使用できます。この値は 255 文字を超えることはできません。

管理 UI プロキシ エディタで <DisplayName> 要素を追加して、ポリシーのラベルに使用する別の自然言語名を指定することもできます。

なし 必須
continueOnError

ポリシーが失敗したときにエラーを返す場合は、false に設定します。これは、ほとんどのポリシーで想定される動作です。

ポリシーが失敗した後もフローの実行を続行する場合は、true に設定します。関連項目:

false 省略可
enabled

ポリシーを適用するには、true に設定します。

ポリシーを無効にするには、false に設定します。ポリシーがフローに接続されている場合でも適用されません。

true 省略可
async

この属性は非推奨となりました。

false 非推奨

<DisplayName> 要素

管理 UI プロキシ エディタで name 属性と一緒に使用して、ポリシーのラベルに使用する自然言語名を指定します。

<DisplayName>Policy Display Name</DisplayName>
デフォルト

なし

この要素を省略した場合、ポリシーの name 属性の値が使用されます。

要否 省略可
タイプ 文字列

<APIKey> 要素

この要素は、API キーを含むフロー変数を指定します。通常、クライアントはクエリ パラメータ、HTTP ヘッダーまたはフォーム パラメータに API キーを送信します。たとえば、キーが x-apikey というヘッダーで送信された場合、そのキーは変数 request.header.x-apikey に格納されます。

デフォルト なし
プレゼンス 必須
種類 文字列

属性

次の表に、<APIKey> 要素の属性を示します。

属性 説明 デフォルト プレゼンス
ref

API キーを含む変数の参照。ポリシーごとに 1 つの場所のみ利用できます。

なし 必須

これらの例では、キーはパラメータと x-apikey というヘッダーで渡されます。

クエリ パラメータの場合:

<VerifyAPIKey name="APIKeyVerifier">
    <APIKey ref="request.queryparam.x-apikey"/>
</VerifyAPIKey>

HTTP ヘッダーの場合:

<VerifyAPIKey name="APIKeyVerifier">
    <APIKey ref="request.header.x-apikey"/>
</VerifyAPIKey>

HTTP フォーム パラメータの場合:

<VerifyAPIKey name="APIKeyVerifier">
    <APIKey ref="request.formparam.x-apikey"/>
</VerifyAPIKey>

<CacheExpiryInSeconds> 要素

この要素はキャッシュに TTL を適用します。これにより、キャッシュされたアクセス トークンの有効期限の期間をカスタマイズできます。サポートされる値の範囲は 1~180 秒です。フロー変数とデフォルト変数を指定できます。このフロー変数の値は、指定したデフォルト値よりも優先されます。

<CacheExpiryInSeconds ref="request.queryparam.cache_expiry">Value 1</CacheExpiryInSeconds>
デフォルト なし

この要素を省略した場合、キャッシュされたアクセス トークンのデフォルトの有効期限は 180 秒です。

プレゼンス 省略可
タイプ 整数
有効な値 ゼロ以外の正の整数。有効期限を秒単位で指定します。

属性

次の表に、<CacheExpiryInSeconds> 要素の属性を示します。

属性 説明 デフォルト プレゼンス
ref

秒単位で表されるキャッシュ有効期限の値を含むフロー変数の参照。

このフロー変数の値は、指定したデフォルト値よりも優先されます。

なし 任意

スキーマ

フロー変数

Verify API Key ポリシーが有効な API キーに適用されると、Apigee は一連のフロー変数を設定します。これらの変数は、フローの後半で実行されるポリシーやコードで使用できます。多くの場合、アプリ名、鍵の承認に使用される API プロダクト、API キーのカスタム属性などの API キーの属性に基づいて、カスタム処理の実行に使用されます。

ポリシーには、下記のような異なるタイプのフロー変数が設定されます。

  • 一般
  • アプリ
  • デベロッパー
  • アナリティクス
  • 収益化

フロー変数のタイプごとに接頭辞が異なります。すべての変数は、配列として具体的に示されているものを除いてスカラーです。

一般的なフロー変数

次の表に、Verify API Key ポリシーにより入力された一般的なフロー変数を示します。これらの変数にはすべて、次の接頭辞が付けられます。

verifyapikey.{policy_name}

例: verifyapikey.{policy_name}.client_id

使用可能な変数は次のとおりです。

変数 説明
client_id リクエスト側のアプリから提供されたコンシューマ キー(API キーまたはアプリキーとも呼ばれます)。
client_secret コンシューマ キーに関連付けられたコンシューマ シークレット。
redirection_uris リクエスト内のリダイレクト URI。
developer.app.id

リクエストを行うデベロッパーまたは AppGroup アプリの ID。

developer.app.name リクエストを行っているデベロッパーまたは AppGroup アプリのアプリ名。
developer.id

リクエストしているアプリの所有者として登録されているデベロッパーまたは AppGroup の ID。

developer.{custom_attrib_name} アプリキー プロファイルから派生したカスタム属性。
DisplayName ポリシーの <DisplayName> 属性の値。
failed API キーの検証が失敗した場合は「true」に設定します。
{custom_app_attrib} アプリ プロファイルから派生したカスタム属性。カスタム属性の名前を指定します。
apiproduct.name* リクエストを検証するために使用する API プロダクトの名前。
apiproduct.{custom_attrib_name}* API プロダクトのプロファイルから派生したカスタム属性。
apiproduct.developer.quota.limit* API プロダクトに設定されている割り当て制限(ある場合)。
apiproduct.developer.quota.interval* API プロダクトに設定されている割り当て間隔(ある場合)。
apiproduct.developer.quota.timeunit* API プロダクトに設定されている割り当て時間の単位(ある場合)。
* API プロダクトが、有効な環境、プロキシ、およびリソース(proxy.pathsuffix から派生したもの)で構成されている場合、API プロダクト変数は自動的に設定されます。API プロダクトの設定手順については、API プロダクトを管理するをご覧ください。

アプリフロー変数

アプリに関する情報を含む以下のフロー変数は、ポリシーにより入力されます。これらの変数にはすべて、次の接頭辞が付けられます。

verifyapikey.{policy_name}.app

次に例を示します。

verifyapikey.{policy_name}.app.name

使用可能な変数は次のとおりです。

変数 説明
name アプリの名前。
id アプリの ID。
accessType Apigee では使用しません。
callbackUrl アプリのコールバック URL。通常は OAuth に対してのみ使用されます。
DisplayName アプリの表示名。
status 「approved」や「revoked」などのアプリのステータス。
apiproducts アプリと関連付けられた API プロダクトのリストを含む配列。
appFamily アプリを含むアプリファミリ、または「デフォルト」。
appParentStatus アプリの親のステータス(「active」や「inactive」など)。
appType アプリタイプが「Developer」であること。
appParentId 親アプリの ID。
created_at アプリの作成時の日付 / 時刻スタンプ。
created_by アプリを作成したデベロッパーのメールアドレス。
last_modified_at アプリの最終更新時の日付 / 時刻スタンプ。
last_modified_by アプリの最終更新をしたデベロッパーのメールアドレス。
{app_custom_attributes} 任意のカスタムアプリ属性。カスタム属性の名前を指定します。

AppGroup フロー変数

AppGroups に関する情報を含む次のフロー変数が、ポリシーによって設定されます。これらの AppGroup 属性は、verifyapikey.{policy_name}.app.appType が「AppGroup」の場合にのみ入力されます。

これらの変数にはすべて、次の接頭辞が付けられます。

verifyapikey.{policy_name}.appgroup

次に例を示します。

verifyapikey.{policy_name}.appgroup.name

使用可能な変数は次のとおりです。

変数 説明
name AppGroup の名前。
id AppGroup ID。
displayName AppGroup の表示名。
appOwnerStatus アプリのオーナーのステータス(「active」、「inactive」、「login_lock」)。
created_at AppGroup 作成時の日付 / 時刻スタンプ。
created_by AppGroup を作成したデベロッパーのメールアドレス。
last_modified_at AppGroup が最後に変更された日付 / 時刻スタンプ。
last_modified_by AppGroup を最後に変更したデベロッパーのメールアドレス。
{appgroup_custom_attributes} 任意のカスタム AppGroup 属性。カスタム属性の名前を指定します。

デベロッパー フロー変数

デベロッパーに関する情報を含む以下のフロー変数は、ポリシーにより入力されます。これらの変数にはすべて、次の接頭辞が付けられます。

verifyapikey.{policy_name}.developer

次に例を示します。

verifyapikey.{policy_name}.developer.id

使用可能な変数は次のとおりです。

変数 説明
id {org_name}@@@{developer_id} を返します。
userName デベロッパーのユーザー名。
firstName デベロッパーの名前。
lastName デベロッパーのラストネーム。
email デベロッパーのメールアドレス。
status デベロッパーのステータス(active、inactive、または login_lock)。
apps デベロッパーに関連付けられたアプリの配列。
created_at デベロッパーの作成時の日付 / 時刻スタンプ。
created_by デベロッパーを作成したユーザーのメールアドレス。
last_modified_at デベロッパーが最後に変更された日付 / 時刻スタンプ。
last_modified_by デベロッパーを変更したユーザーのメールアドレス。
{developer_custom_attributes} 任意のカスタム デベロッパー属性。カスタム属性の名前を指定します。

アナリティクス変数

有効な API キーに Verify API Key ポリシーが適用されると、次の変数がアナリティクスに自動的に入力されます。これらの変数は、Verify API Key ポリシーと OAuth ポリシーによってのみ入力されます。

変数と値は、アナリティクス レポートを作成するためのディメンションとして使用して、デベロッパーやアプリの消費パターンを可視化できます。

  • apiproduct.name
  • developer.app.name
  • client_id
  • developer.id

収益化フロー変数

ユーザーの認証後、VerifyAPIKey ポリシーで公開済みのすべての料金プランを確認し、有効化と有効期限に基づいて有効な料金プランを判別します。有効な公開済みの料金プランが見つかった場合、次のフロー変数が設定されます。

変数 説明
mint.mintng_is_apiproduct_monetized 有効な公開済みの料金プランが見つかった場合は true
mint.mintng_rate_plan_id 料金プラン ID。
mint.rateplan_end_time_ms 料金プランの有効期限。例: 1619433556408
mint.rateplan_start_time_ms 料金プランの有効化日時。例: 1618433956209

エラー リファレンス

This section describes the fault codes and error messages that are returned and fault variables that are set by Apigee when this policy triggers an error. This information is important to know if you are developing fault rules to handle faults. To learn more, see What you need to know about policy errors and Handling faults.

Runtime errors

These errors can occur when the policy executes.

Fault code HTTP status Cause
keymanagement.service.consumer_key_missing_api_product_association 400

The application credential is missing an API product association. Please associate the key's application with an API product. Note that this applies for all application types, such as developer apps and AppGroup apps.

keymanagement.service.DeveloperStatusNotActive 401

The developer who created the Developer App that has the API key you are using has an inactive status. When an App Developer's status is set to inactive, any Developer Apps created by that developer are deactivated. An admin user with appropriate permissions (such as Organization Administrator) can change a developer's status in the following ways:

keymanagement.service.invalid_client-app_not_approved 401 The Developer App associated with the API key is revoked. A revoked app cannot access any API products and cannot invoke any API managed by Apigee. An org admin can change the status of a Developer App using the Apigee API. See Generate Key Pair or Update Developer App Status.
oauth.v2.FailedToResolveAPIKey 401 The policy expects to find the API key in a variable that is specified in the policy's <APIKey> element. This error arises when the expected variable does not exist (it cannot be resolved).
oauth.v2.InvalidApiKey 401 An API key was received by Apigee, but it is invalid. When Apigee looks up the key in its database, it must exactly match the one that was sent in the request. If the API worked previously, make sure the key was not regenerated. If the key was regenerated, you will see this error if you try to use the old key. For details, see Controlling access to your APIs by registering apps.
oauth.v2.InvalidApiKeyForGivenResource 401 An API key was received by Apigee, and it is valid; however, it does not match an approved key in the Developer App associated with your API proxy through a Product.

Deployment errors

These errors can occur when you deploy a proxy containing this policy.

Error name Cause
SpecifyValueOrRefApiKey The <APIKey> element does not have a value or key specified.

Fault variables

These variables are set when a runtime error occurs. For more information, see What you need to know about policy errors.

Variables Where Example
fault.name="fault_name" fault_name is the name of the fault, as listed in the Runtime errors table above. The fault name is the last part of the fault code. fault.name Matches "FailedToResolveAPIKey"
oauthV2.policy_name.failed policy_name is the user-specified name of the policy that threw the fault. oauthV2.VK-VerifyAPIKey.failed = true

Example error responses

{  
   "fault":{  
      "faultstring":"Invalid ApiKey",
      "detail":{  
         "errorcode":"oauth.v2.InvalidApiKey"
      }
   }
}
{  
   "fault":{  
      "detail":{  
         "errorcode":"keymanagement.service.DeveloperStatusNotActive"
      },
      "faultstring":"Developer Status is not Active"
   }
}

Example fault rule

<FaultRule name="FailedToResolveAPIKey">
    <Step>
        <Name>AM-FailedToResolveAPIKey</Name>
    </Step>
    <Condition>(fault.name Matches "FailedToResolveAPIKey") </Condition>
</FaultRule>