このページの内容は Apigee と Apigee ハイブリッドに該当します。
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.key を myKey という名前のクエリ パラメータから入力できます。
<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 |
ポリシーの内部名。 管理 UI プロキシ エディタで |
なし | 必須 |
continueOnError |
ポリシーが失敗したときにエラーを返す場合は、 ポリシーが失敗した後もフローの実行を続行する場合は、 |
false | 省略可 |
enabled |
ポリシーを適用するには、 ポリシーを無効にするには、 |
true | 省略可 |
async |
この属性は非推奨となりました。 |
false | 非推奨 |
<DisplayName> 要素
管理 UI プロキシ エディタで name
属性と一緒に使用して、ポリシーのラベルに使用する自然言語名を指定します。
<DisplayName>Policy Display Name</DisplayName>
デフォルト |
なし この要素を省略した場合、ポリシーの |
---|---|
要否 | 省略可 |
タイプ | 文字列 |
<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 |
エラー リファレンス
このセクションでは、このポリシーによってエラーがトリガーされたときに返される障害コードとエラー メッセージ、Apigee によって設定される障害変数について説明します。これは、障害に対処する障害ルールを作成するうえで重要な情報です。詳細については、ポリシーエラーについて知っておくべきことと障害の処理をご覧ください。
ランタイム エラー
このエラーは、ポリシーの実行時に発生することがあります。
障害コード | HTTP ステータス | 原因 |
---|---|---|
keymanagement.service.consumer_key_missing_api_product_association |
400 |
アプリケーションの認証情報に API プロダクトの関連付けが含まれていません。キーのアプリケーションを API プロダクトに関連付けてください。これは、デベロッパー アプリや AppGroup アプリなど、すべての種類のアプリケーションに適用されます。 |
keymanagement.service.DeveloperStatusNotActive |
401 |
使用している API キーに関連付けられたデベロッパー アプリのデベロッパーが非アクティブになっています。アプリ デベロッパーのステータスが非アクティブに設定されると、このデベロッパーが作成したすべてのデベロッパー アプリも無効になります。適切な権限のある管理ユーザー(組織管理者など)は、次の方法でデベロッパーのステータスを変更できます。
|
keymanagement.service.invalid_client-app_not_approved |
401 |
API キーに関連付けられたデベロッパー アプリが取り消されています。取り消されたアプリは、API プロダクトにアクセスできず、Apigee が管理する API を呼び出すことはできません。組織管理者は、Apigee API を使用してデベロッパー アプリのステータスを変更できます。鍵ペアの生成またはデベロッパー アプリのステータスの更新をご覧ください。 |
oauth.v2.FailedToResolveAPIKey |
401 |
ポリシーは、ポリシーの <APIKey> 要素で指定された変数に API キーが格納されていることを前提としています。 このエラーは、想定した変数が存在しない(解決できない)場合に発生します。 |
oauth.v2.InvalidApiKey |
401 |
Apigee が API キーを受け取りましたが、キーが無効です。Apigee は、データベースでキーを検索するときに、リクエストで送信されたキーと完全に一致するキーを検索します。以前に機能していた API の場合は、キーが再生成されていないことを確認してください。キーが再生成されているときに古いキーを使用しようとすると、このエラーが表示されます。詳しくは、アプリ登録を使用した API へのアクセスの管理をご覧ください。 |
oauth.v2.InvalidApiKeyForGivenResource |
401 |
Apigee は、有効な API キーを受信していますが、プロダクトで API プロキシに関連付けられたデベロッパー アプリで承認済みのキーと一致していません。 |
デプロイエラー
以下のエラーは、このポリシーを含むプロキシをデプロイするときに発生することがあります。
エラー名 | 原因 |
---|---|
SpecifyValueOrRefApiKey |
<APIKey> 要素に値とキーが指定されていません。 |
障害変数
ランタイム エラーが発生すると、次の変数が設定されます。詳細については、ポリシーエラーについて知っておくべきことをご覧ください。
変数 | 説明 | 例 |
---|---|---|
fault.name="fault_name" |
fault_name は、上記のランタイム エラーの表に記載されている障害の名前です。障害名は、障害コードの最後の部分です。 | fault.name Matches "FailedToResolveAPIKey" |
oauthV2.policy_name.failed |
policy_name は、障害が発生したポリシーのユーザー指定の名前です。 | oauthV2.VK-VerifyAPIKey.failed = true |
エラー レスポンスの例
{ "fault":{ "faultstring":"Invalid ApiKey", "detail":{ "errorcode":"oauth.v2.InvalidApiKey" } } }
{ "fault":{ "detail":{ "errorcode":"keymanagement.service.DeveloperStatusNotActive" }, "faultstring":"Developer Status is not Active" } }
障害ルールの例
<FaultRule name="FailedToResolveAPIKey"> <Step> <Name>AM-FailedToResolveAPIKey</Name> </Step> <Condition>(fault.name Matches "FailedToResolveAPIKey") </Condition> </FaultRule>