

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon Verified Permissions による承認
<a name="amazon-cognito-authorization-with-avp"></a>

[Amazon Verified Permissions](https://docs.aws.amazon.com/verifiedpermissions/latest/userguide/what-is-avp.html) は、お客様が構築するアプリケーションの認可サービスです。Amazon Cognito ユーザープールを ID ソースとして追加すると、アプリケーションはユーザープールアクセスまたはアイデンティティ (ID) トークンを Verified Permissions に渡して、許可または拒否を決定できます。Verified Permissions は、[Cedar ポリシー言語](https://docs.cedarpolicy.com/)で記述したポリシーに基づいてユーザーのプロパティとリクエストコンテキストを考慮します。リクエストコンテキストには、リクエストしたドキュメント、画像、その他のリソースの ID と、ユーザーがリソースに対して実行するアクションを含めることができます。

アプリケーションは、[IsAuthorizedWithToken](https://docs.aws.amazon.com/verifiedpermissions/latest/apireference/API_IsAuthorizedWithToken.html) API リクエストまたは [BatchIsAuthorizedWithToken](https://docs.aws.amazon.com/verifiedpermissions/latest/apireference/API_BatchIsAuthorizedWithToken.html) API リクエストで Verified Permissions にユーザーの ID またはアクセストークンを提供できます。これらの API オペレーションは、ユーザーを `Principal` として受け入れ、アクセスする `Resource` の `Action` についての認可に関する決定を行います。カスタム `Context` を追加することで、より詳細なアクセス決定を行うことができます。

アプリケーションが `IsAuthorizedWithToken` API リクエストでトークンを提示すると、Verified Permissions は次の検証を実行します。

1. ユーザープールは、リクエストされたポリシーストアに設定された Verified Permissions の [ID ソース](https://docs.aws.amazon.com/verifiedpermissions/latest/userguide/identity-providers.html)です。

1. アクセストークンまたは ID トークンの `client_id` または `aud` クレームは、それぞれ Verified Permissions に提供したユーザープールアプリケーションのクライアント ID と一致します。このクレームを検証するには、Verified Permissions の ID ソースで[クライアント ID 検証](https://docs.aws.amazon.com/verifiedpermissions/latest/userguide/cognito-validation.html)を設定する必要があります。

1. トークンの有効期限は切れていません。

1. トークン内の `token_use` クレームの値は、`IsAuthorizedWithToken` に渡したパラメータと一致します。`token_use` クレームは、`accessToken` パラメータに渡した場合は `access` である必要があり、`identityToken` パラメータに渡した場合は `id` である必要があります。

1. トークンの署名は、ユーザープールの公開された JSON ウェブキー (JWK) から取得されます。JWK は、`https://cognito-idp.{{Region}}.amazonaws.com/{{your user pool ID}}/.well-known/jwks.json` で確認できます。

**失効したトークンと削除されたユーザー**  
Verified Permissions は、ID ソースとユーザートークンの有効期限からの既知の情報のみを検証します。Verified Permissions では、トークンの失効やユーザーの存在は確認されません。ユーザーのトークンを取り消したり、ユーザープールからユーザープロファイルを削除したりした場合でも、Verified Permissions は有効期限が切れるまでトークンを有効と見なします。

**ポリシーの評価**  
ユーザープールを[ポリシーストア](https://docs.aws.amazon.com/verifiedpermissions/latest/userguide/terminology.html#term-policy-store)の [ID ソース](https://docs.aws.amazon.com/verifiedpermissions/latest/userguide/identity-providers.html)として設定します。Verified Permissions へのリクエストでユーザーのトークンを送信するようにアプリケーションを設定します。Verified Permissions はリクエストごとに、トークンのクレームをポリシーと比較します。Verified Permissions は、 AWSの IAM ポリシーに似ていて、プリンシパル**、リソース**、およびアクション**を宣言します。Verified Permissions は、リクエストが許可されたアクションと一致し、明示的な `Deny` アクションと一致しない場合は `Allow` で応答し、それ以外の場合は `Deny` で応答します。詳細については、「[Amazon Verified Permissions ユーザーガイド](https://docs.aws.amazon.com/verifiedpermissions/latest/userguide/policies.html)」の「*Amazon Verified Permissions のポリシー*」を参照してください。

**トークンをカスタマイズする**  
Verified Permissions に提示するユーザークレームを変更、追加、削除するには、アクセストークンと ID トークンの内容を [トークン生成前の Lambda トリガー](user-pool-lambda-pre-token-generation.md) でカスタマイズします。プレトークンを生成するトリガーを使用すると、トークンでクレームを追加および変更できます。例えば、データベースで追加のユーザー属性をクエリし、それらを ID トークンにエンコードできます。

**注記**  
Verified Permissions がクレームを処理する方法を考慮して、`cognito`、`dev`、または `custom` という名前のクレームをプレトークンの生成機能に追加しないでください。これらの予約済みクレームのプレフィックスを、`cognito:username` のようにコロンで区切られた形式ではなく、完全なクレーム名として提示すると、承認リクエストは失敗します。

**その他のリソース**
+ [Amazon Cognito トークンを Verified Permissions スキーマにマッピングする](https://docs.aws.amazon.com/verifiedpermissions/latest/userguide/identity-sources_map-token-to-schema.html)
+ [Amazon Verified Permissions と Amazon Cognito を使用して API Gateway API を認可する](https://aws.amazon.com/blogs/security/authorize-api-gateway-apis-using-amazon-verified-permissions-and-amazon-cognito/)
+ [ワークショップ: Amazon Cognito と Verified Permissions による認証と認可](https://catalog.workshops.aws/app-auth)

## Verified Permissions を使用した API 認可
<a name="amazon-cognito-authorization-with-avp-api-authorization"></a>

ID トークンまたはアクセストークンは、Verified Permissions を使用してバックエンド Amazon API Gateway REST API へのリクエストを認可できます。ユーザープールと API への即時リンクを含む[ポリシーストア](https://docs.aws.amazon.com/verifiedpermissions/latest/userguide/policy-stores.html)を作成できます。「[API Gateway と ID ソースを使用してセットアップする](https://docs.aws.amazon.com/verifiedpermissions/latest/userguide/policy-stores_create.html)」を開始オプションとして使用すると、Verified Permissions はユーザープールの ID ソースをポリシーストアに追加し、Lambda オーソライザーを API に追加します。アプリケーションがユーザープールベアラトークンを API に渡すと、Lambda オーソライザーは Verified Permissions を呼び出します。オーソライザーはトークンをプリンシパルとして、リクエストパスとメソッドをアクションとして渡します。

次の図は、Verified Permissions を使用した API Gateway API 承認フローを示しています。詳細については、「Amazon Verified Permissions ユーザーガイド」の「[API-linked policy stores](https://docs.aws.amazon.com/verifiedpermissions/latest/userguide/policy-stores_api-userpool.html)」を参照してください。

![Amazon Verified Permissions を使用した API 認証のフローを示す図。アプリケーションは Amazon API Gateway API にリクエストを行います。API は Lambda オーソライザーを呼び出します。オーソライザーは、Verified Permissions に API リクエストを行います。Verified Permissions はトークンの有効性をチェックし、認可に関する決定を返します。](http://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/images/amazon-cognito-avp-use-case.png)


Verified Permissions は、[ユーザープールグループ](cognito-user-pools-user-groups.md)に関する API 認可を構築します。ID トークンとアクセストークンの両方に `cognito:groups` クレームが含まれているため、ポリシーストアはさまざまなアプリケーションコンテキストで API のロールベースのアクセス制御 (RBAC) を管理できます。

### ポリシーストア設定の選択
<a name="amazon-cognito-authorization-with-avp-api-authorization-token-type"></a>

ポリシーストアで ID ソースを設定するときは、アクセストークンを処理するか、ID トークンを処理するかを選択する必要があります。この決定は、ポリシーエンジンの動作方法にとって重要です。ID トークンにはユーザー属性が含まれます。アクセストークンには、[OAuth スコープ](cognito-user-pools-define-resource-servers.md)というユーザーアクセスコントロール情報が含まれています。どちらのトークンタイプにもグループメンバー情報が含まれていますが、通常は Verified Permissions ポリシーストアを使用して RBAC のアクセストークンを使用することをお勧めします。アクセストークンは、認可に関する決定に役立つスコープをグループメンバーシップに追加します。アクセストークンのクレームは、認可リクエストの[コンテキスト](https://docs.aws.amazon.com/verifiedpermissions/latest/userguide/context.html)になります。

ユーザープールを ID ソースとして設定する場合は、ユーザーエンティティタイプとグループエンティティタイプも設定する必要があります。エンティティタイプは、Verified Permissions ポリシーで参照できるプリンシパル、アクション、リソース識別子です。ポリシーストア内のエンティティは*メンバーシップ*関係を持つことができ、1 つのエンティティを*親*エンティティのメンバーにすることができます。メンバーシップを使用すると、プリンシパルグループ、アクショングループ、リソースグループを参照できます。ユーザープールグループの場合、指定するユーザーエンティティタイプはグループエンティティタイプのメンバーである必要があります。[API リンクポリシーストア](https://docs.aws.amazon.com/verifiedpermissions/latest/userguide/policy-stores_api-userpool.html)をセットアップするか、Verified Permissions コンソールで**ガイド付きセットアップ**に従うと、ポリシーストアは自動的にこの親メンバー関係を持ちます。

ID トークンは、RBAC を属性ベースのアクセス制御 (ABAC) と組み合わせることができます。[API リンクポリシーストア](https://docs.aws.amazon.com/verifiedpermissions/latest/userguide/policy-stores_api-userpool.html)を作成したら、[ユーザー属性](#amazon-cognito-authorization-with-avp-example-policy)*と*グループメンバーシップを使用してポリシーを強化できます。ID トークンの属性クレームは、認可リクエストの[プリンシパル属性](https://docs.aws.amazon.com/verifiedpermissions/latest/userguide/policies_examples-abac.html)になります。ポリシーは、プリンシパル属性に基づいて認可に関する決定を行うことができます。

また、指定した許容可能なアプリケーションクライアントのリストに一致する `aud` クレームまたは `client_id` クレームを持つトークンを受け入れるようにポリシーストアを設定することもできます。

### ロールベースの API 認可用ポリシーの例
<a name="amazon-cognito-authorization-with-avp-api-authorization-example"></a>

次のポリシー例は、[PetStore](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-create-api-from-example.html) サンプル REST API 用の Verified Permissions ポリシーストアのセットアップによって作成されました。

```
permit(
  principal in PetStore::UserGroup::"us-east-1_EXAMPLE|MyGroup",
  action in [ PetStore::Action::"get /pets", PetStore::Action::"get /pets/{petId}" ],
  resource
  );
```

Verified Permissions は、次の場合にアプリケーションからの認可リクエストに `Allow` 決定を返します。

1. アプリケーションは、`Authorization` ヘッダー内の ID トークンまたはアクセストークンをベアラトークンとして渡しました。

1. アプリケーションは、文字列 `MyGroup` を含む `cognito:groups` クレームでトークンを渡しました。

1. アプリケーションは、`https://myapi.example.com/pets` または `https://myapi.example.com/pets/scrappy` などに `HTTP GET` リクエストを行いました。

## Amazon Cognito ユーザーのポリシーの例。
<a name="amazon-cognito-authorization-with-avp-example-policy"></a>

ユーザープールは、API リクエスト以外の条件で Verified Permissions への認可リクエストを生成することもできます。アプリケーション内のアクセスコントロールの決定は、ポリシーストアに送信できます。例えば、リクエストがネットワークを通過する前に、属性ベースのアクセス制御で Amazon DynamoDB または Amazon S3 セキュリティを補完し、クォータの使用量を減らすことができます。

次の例では、[Cedar ポリシー言語](https://docs.cedarpolicy.com/)を使用して、1 つのユーザープールアプリケーションクライアントで認証する Finance ユーザーに `example_image.png` の読み取りと書き込みを許可しています。アプリケーションのユーザーである John は、アプリケーションクライアントから ID トークンを受け取り、それを GET リクエストで認可が必要な URL`https://example.com/images/example_image.png`に渡します。John の ID トークンには、ユーザープールアプリケーションのクライアント ID `1234567890example` の `aud` クレームが含まれています。また、プレトークンを生成する Lambda 関数によって、John 用に新しいクレーム `costCenter` (値は `Finance1234`) が挿入されています。

```
permit (
   principal,
   actions in [ExampleCorp::Action::"readFile", "writeFile"],
   resource == ExampleCorp::Photo::"example_image.png"
)
when {
   principal.aud == "1234567890example" &&
   principal.custom.costCenter like "Finance*"
};
```

次のリクエスト本文の結果は `Allow` レスポンスになります。

```
{
   "accesstoken": "{{[John's ID token]}}",
   "action": {
      "actionId": "readFile",
      "actionType": "Action"
   },
   "resource": {
      "entityId": "example_image.png",
      "entityType": "Photo"
   }
}
```

Verified Permissions でプリンシパルを指定する場合は、次の形式を使用してください。

```
permit (
   principal == [Namespace]::[Entity]::"[user pool ID]|[user sub]",
   action,
   resource
);
```

以下は、ID `us-east-1_Example`、サブ ID (ユーザー ID) `973db890-092c-49e4-a9d0-912a4c0a20c7` を持つユーザープール内のユーザーのプリンシパルの例です。

```
principal == {{ExampleCorp}}::{{User}}::"{{us-east-1_Example}}|{{973db890-092c-49e4-a9d0-912a4c0a20c7}}",
```

Verified Permissions でユーザーグループを指定する場合は、次の形式を使用してください。

```
permit (
   principal in [Namespace]::[Group Entity]::"[Group name]",
   action,
   resource
);
```

**属性ベースのアクセスコントロール**  
アプリの Verified Permissions による認可と、 AWS 認証情報の Amazon Cognito ID プールの[アクセスコントロール機能の属性](https://docs.aws.amazon.com/cognito/latest/developerguide/attributes-for-access-control.html)は、どちらも属性ベースのアクセスコントロール (ABAC) の形式です。以下は、Verified Permissions と Amazon Cognito ABAC の機能を比較したものです。ABAC では、システムがエンティティの属性を検査し、定義した条件に基づいて承認の決定を行います。


| サービス | プロセス | 結果 | 
| --- |--- |--- |
| Amazon Verified Permissions | Returns an 許可 or 拒否 decision from analysis of a user pool JWT. | Access to application resources succeeds or fails based on Cedar policy evaluation. | 
| Amazon Cognito identity pools (attributes for access control) | Assigns [セッションタグ](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html) to your user based on their attributes. IAM policy conditions can check tags 許可 or 拒否 user access to AWS のサービス. | A tagged session with temporary AWS credentials for an IAM role. | 