

# Amazon Cognito ユーザープールをオーソライザーとして使用して REST API へのアクセスを制御する
REST API のオーソライザーとして Amazon Cognito ユーザープールを使用する

[IAM ロールとポリシー](permissions.md)または [Lambda オーソライザー](apigateway-use-lambda-authorizer.md) (以前のカスタムオーソライザー) の代わりに、[Amazon Cognito ユーザープール](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-identity-pools.html)を使用して、Amazon API Gateway の API にアクセスできるユーザーを制御します。

API で Amazon Cognito ユーザープールを使用するには、`COGNITO_USER_POOLS` タイプのオーソライザーを作成してから、そのオーソライザーを使用する API メソッドを構成する必要があります。API がデプロイされた後、クライアントはまずユーザーをユーザープールに署名し、ユーザーの [ID またはアクセストークン](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html)を取得してから、トークンの 1 つ (通常はリクエストの `Authorization` ヘッダーに設定されている) で API メソッドを呼び出す必要があります。API 呼び出しは、必要なトークンが提供され、提供されたトークンが有効な場合にのみ成功します。そうでない場合、クライアントは認証された認証情報を持たないため呼び出しを許可されません。

ID トークンは、サインインされたユーザーの ID リクエストに基づいて API 呼び出しを承認するために使用されます。アクセストークンは、指定されたアクセス保護されたリソースのカスタムスコープに基づいて API 呼び出しを承認するために使用されます。詳細については、「[ユーザープールのトークンの使用](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html)」および「[リソースサーバーおよびカスタムスコープの管理](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-define-resource-servers.html)」を参照してください。

API 用の Amazon Cognito ユーザープールを作成および設定するには、次のタスクを実行します。
+ Amazon Cognito コンソール、CLI/SDK、または API を使用して、ユーザープールを作成するか、別の AWS アカウントが所有するものを使用します。
+ API Gateway コンソール、CLI/SDK、または API を使用して、選択したユーザープールで API Gateway オーソライザーを作成します。
+ API Gateway コンソール、CLI/SDK、または API を使用して、選択した API メソッドでオーソライザーを有効にします。

 ユーザープールを有効にして API メソッドを呼び出すには、API クライアントで次のタスクを実行します。
+  Amazon Cognito CLI/SDK、または API を使用して、選択したユーザープールにユーザーをサインインし、ID トークンまたはアクセストークンを取得します。SDK の使用方法の詳細については、「[AWS SDK を使用した Amazon Cognito のコード例](https://docs.aws.amazon.com/cognito/latest/developerguide/service_code_examples.html)」を参照してください。
+  クライアント固有のフレームワークを使用して、デプロイされた API Gateway API を呼び出し、`Authorization` ヘッダーに適切なトークンを指定します。

API 開発者は、クライアント開発者に、ユーザープール ID、クライアント ID、および場合によってはユーザープールの一部として定義されている関連クライアントのシークレットを提供する必要があります。

**注記**  
ユーザーが Amazon Cognito の認証情報を使用してサインインし、IAM ロールのアクセス許可を使用するための一時的な認証情報を取得するには、[Amazon Cognito フェデレーテッドアイデンティティ](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-identity.html)を使用します。API リソースエンドポイントの HTTP メソッドごとに、認可タイプ、カテゴリ `Method Execution` を `AWS_IAM` に設定します。

このセクションでは、ユーザープールの作成方法、API Gateway API をユーザープールと統合する方法、ユーザープールと統合された API を呼び出す方法を説明します。

**Topics**
+ [

# REST API 用の Amazon Cognito ユーザープールを作成する
](apigateway-create-cognito-user-pool.md)
+ [

# REST API と Amazon Cognito ユーザープールを統合する
](apigateway-enable-cognito-user-pool.md)
+ [

# Amazon Cognito ユーザープールと統合された REST API を呼び出す
](apigateway-invoke-api-integrated-with-cognito-user-pool.md)
+ [

# API Gateway コンソールを使用して REST API 用のクロスアカウントの Amazon Cognito オーソライザーを設定する
](apigateway-cross-account-cognito-authorizer.md)
+ [

# CloudFormation を使用して REST API の Amazon Cognito オーソライザーを作成する
](apigateway-cognito-authorizer-cfn.md)

# REST API 用の Amazon Cognito ユーザープールを作成する


API をユーザープールと統合する前に、Amazon Cognito でユーザープールを作成する必要があります。ユーザープールの設定は、[Amazon Cognito のすべてのリソースクォータに従う必要があります](https://docs.aws.amazon.com/cognito/latest/developerguide/limits.html)。グループ、ユーザー、ロールなどのユーザー定義の Amazon Cognito 変数に使用できるのは、英数字だけです。ユーザープールを作成する方法については、*Amazon Cognito デベロッパーガイド*の「[チュートリアル: ユーザープールを作成する](https://docs.aws.amazon.com/cognito/latest/developerguide/tutorial-create-user-pool.html)」を参照してください。

ユーザープール ID、クライアント ID、クライアントシークレットをメモします。クライアントは、ユーザーがユーザープールに登録、サインインし、ユーザープールを使用して設定された API メソッドを呼び出すリクエストに含めるための ID またはアクセストークンを取得するために、それらを Amazon Cognito に提供する必要があります。また、API Gateway のオーソライザーとしてユーザープールを設定する場合、以下に説明するようにユーザープール名を指定する必要があります。

アクセストークンを使用して API メソッド呼び出しを承認している場合は、特定のリソースサーバーに必要なカスタムスコープを設定するために、ユーザープールとのアプリケーション統合を設定するようにしてください。Amazon Cognito ユーザープールでトークンを使用する方法の詳細については、「[ユーザープールでトークンを使用する](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html)」を参照してください。リソースサーバーの詳細については、「[ユーザープールのリソースサーバーを定義する](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-define-resource-servers.html)」を参照してください。

設定されたリソースサーバー ID とカスタムスコープ名をメモしておきます。これらは、`COGNITO_USER_POOLS` オーソライザーが使用する [**OAuth スコープ**] のアクセススコープのフルネームを作成するために必要です。

![\[Amazon Cognito ユーザープールのリソースサーバーとスコープ\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/images/cognito-user-pool-custom-scopes-new-console.png)


# REST API と Amazon Cognito ユーザープールを統合する


API Gateway で Amazon Cognito ユーザープールを作成し、そのユーザープールを使用する `COGNITO_USER_POOLS` オーソライザーを作成する必要があります。次の手順では、この操作を API Gateway コンソールを使用して行う方法について説明します。

**注記**  
[https://docs.aws.amazon.com/apigateway/latest/api/API_CreateAuthorizer.html](https://docs.aws.amazon.com/apigateway/latest/api/API_CreateAuthorizer.html) アクションを使用して、複数のユーザープールを使用する `COGNITO_USER_POOLS` オーソライザーを作成できます。1 つの `COGNITO_USER_POOLS` オーソライザーには最大 1,000 のユーザープールを使用できます。この制限を増やすことはできません。

**重要**  
以下の手順の実行後、API をデプロイまたは再デプロイして変更を伝達する必要があります。API のデプロイの詳細については、「[API Gateway で REST API をデプロイする](how-to-deploy-api.md)」を参照してください。

**API Gateway コンソールを使用して `COGNITO_USER_POOLS` 認証を作成するには**

1. 新しい API を作成、または API Gateway に既存の API を選択します。

1. メインナビゲーションペインで、**[オーソライザー]** を選択します。

1. **[オーソライザーの作成]** を選択します。

1. ユーザープールを使用するように新しいオーソライザーを設定するには、次の手順を実行します。

   1.  **[オーソライザー名]** に名前を入力します。

   1. **[オーソライザータイプ]** には、**[Cognito]** を選択します。

   1. **[Cognito ユーザープール]** では、Amazon Cognito を作成した場所 AWS リージョン を選択し、使用可能なユーザープールを選択します。

      ユーザープールを定義するには、ステージ変数を使用できます。ユーザープールには、形式として `arn:aws:cognito-idp:us-east-2:111122223333:userpool/${stageVariables.MyUserPool}` を使用します。

   1.  ユーザーがサインインした際に Amazon Cognito が返す ID またはアクセストークンを渡すように、**[トークンソース]** には、ヘッダー名として **Authorization** と入力します。

   1. (オプション) 必要に応じて **[トークン検証]** フィールドに正規表現を入力して、リクエストが Amazon Cognito で承認される前に ID トークンの `aud` (対象者) フィールドを検証します。アクセストークンを使用する場合、この検証では、アクセストークンが `aud` フィールドを含まないために要求が拒否されることに注意してください。

   1. **[オーソライザーの作成]** を選択します。

1. `COGNITO_USER_POOLS` オーソライザーを作成した後、ユーザープールからプロビジョニングされた ID トークンを指定して、呼び出しをテストできます。アクセストークンを使用してオーソライザーの呼び出しをテストすることはできません。

   [Amazon Cognito ID SDK](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-integrate-apps.html) を呼び出してユーザーサインインを実行することで、この ID トークンを取得できます。[https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html) アクションも使用できます。**[認可スコープ]** を設定しない場合、API Gateway は指定されたトークンを ID トークンとして扱います。

前述の手順では、新しく作成した Amazon Cognito ユーザープールを使用する `COGNITO_USER_POOLS` オーソライザーを作成します。API メソッドでオーソライザーを有効にした方法に応じて、統合トークンまたは統合ユーザープールからプロビジョニングされたアクセストークンを使用できます。

**メソッドで `COGNITO_USER_POOLS` オーソライザーを設定するには**

1. **[リソース]** をクリックします。新しいメソッドを選択するか、既存のメソッドを選択します。必要に応じて、リソースを作成します。

1. **[メソッドリクエスト]** タブの **[メソッドリクエスト設定]** で、**[編集]** を選択します。

1. **[オーソライザー]** には、ドロップダウンメニューから、先ほど作成した **Amazon Cognito ユーザープールオーソライザー**を選択します。

1.  ID トークンを使用するには、次の操作を行います。

   1. **[認可スコープ]** は、空のままにします。

   1. 必要に応じて、**[統合リクエスト]** で、ユーザープールからバックエンドに特定の ID クレームプロパティを渡すために、本文マッピングテンプレートに `$context.authorizer.claims['property-name']` 式または `$context.authorizer.claims.property-name` 式を追加します。`sub` や`custom-sub` などの簡単なプロパティ名については、2 つの表記法は同じです。`custom:role` などの複雑なプロパティ名の場合、ドット表記は使用できません。たとえば、以下のマッピング式は、バックエンドに、クレームの `sub` および `email` の[標準フィールド](https://openid.net/specs/openid-connect-core-1_0.html#StandardClaims)を渡します。

      ```
      {
      	"context" : {
      		"sub" : "$context.authorizer.claims.sub",
      		"email" : "$context.authorizer.claims.email"
      	}
      }
      ```

      ユーザープールを設定するときにカスタムクレームフィールドを宣言した場合は、同じパターンに従ってカスタムフィールドにアクセスできます。次の例では、クレームの `role` カスタムフィールドを取得します。

      ```
      {
      	"context" : {
      		"role" : "$context.authorizer.claims.role"
          }
      }
      ```

      カスタムクレームフィールドが `custom:role` として宣言されている場合は、以下の例を使用してクレームのプロパティを取得します。

      ```
      {
      	"context" : {
      		"role" : "$context.authorizer.claims['custom:role']"
          }
      }
      ```

1.  アクセストークンを使用するには、次の操作を行います。

   1. **[認可スコープ]** には、Amazon Cognito ユーザープールが作成された際に設定されたスコープのフルネームを 1 つ以上入力します。たとえば、「[REST API 用の Amazon Cognito ユーザープールを作成する](apigateway-create-cognito-user-pool.md)」の例では、スコープの 1 つは `https://my-petstore-api.example.com/cats.read` です。

      実行時に、このステップのメソッドで指定されたスコープが、受信トークンで要求されているスコープと一致する場合、メソッド呼び出しは成功します。それ以外の場合、`401 Unauthorized` レスポンスでコールが失敗します。

   1.  **[保存]** を選択します。

1. 選択した他のメソッドにこれらの手順を繰り返してください。

`COGNITO_USER_POOLS` オーソライザーで、[**OAuth Scopes**] オプションが指定されていない場合、API Gateway は、指定されたトークンを ID トークンとして処理し、ユーザープールからのトークンに対して、要求された ID を検証します。それ以外の場合、API Gateway は提供されたトークンをアクセストークンとして処理し、トークンで要求されたアクセススコープをメソッドで宣言されている承認スコープと照合して検証します。

API Gateway コンソールを使う代わりに、OpenAPI 定義ファイル内で指定してメソッド上での Amazon Cognito ユーザープールを有効化し、API 定義を API Gateway にインポートすることもできます。

**OpenAPI 定義ファイルを使って COGNITO\$1USER\$1POOLS オーソライザーをインポートするには**

1. API 用の OpenAPI 定義ファイルを作成 (またはエクスポート) します。

1. OpenAPI 3.0 の `COGNITO_USER_POOLS` セクション、または Open API 2.0 の `MyUserPool` セクションの一部として、`securitySchemes` オーソライザー (`securityDefinitions`) JSON を次のように指定します。

------
#### [ OpenAPI 3.0 ]

   ```
     "securitySchemes": {
       "MyUserPool": {
         "type": "apiKey",
         "name": "Authorization",
         "in": "header",
         "x-amazon-apigateway-authtype": "cognito_user_pools",
         "x-amazon-apigateway-authorizer": {
           "type": "cognito_user_pools",
           "providerARNs": [
             "arn:aws:cognito-idp:{region}:{account_id}:userpool/{user_pool_id}"
           ]
         }
       }
   ```

------
#### [ OpenAPI 2.0 ]

   ```
     "securityDefinitions": {
       "MyUserPool": {
         "type": "apiKey",
         "name": "Authorization",
         "in": "header",
         "x-amazon-apigateway-authtype": "cognito_user_pools",
         "x-amazon-apigateway-authorizer": {
           "type": "cognito_user_pools",
           "providerARNs": [
             "arn:aws:cognito-idp:{region}:{account_id}:userpool/{user_pool_id}"
           ]
         }
       }
   ```

------

1. メソッドの認可にアイデンティティトークンを使用するには、ルートリソースの次の GET メソッドに示すように、メソッドの `{ "MyUserPool": [] }` 定義に `security` を追加します。

   ```
     "paths": {
       "/": {
         "get": {
           "consumes": [
             "application/json"
           ],
           "produces": [
             "text/html"
           ],
           "responses": {
             "200": {
               "description": "200 response",
               "headers": {
                 "Content-Type": {
                   "type": "string"
                 }
               }
             }
           },
           "security": [
             {
               "MyUserPool": []
             }
           ],        
           "x-amazon-apigateway-integration": {
             "type": "mock",
             "responses": {
               "default": {
                 "statusCode": "200",
                 "responseParameters": {
                   "method.response.header.Content-Type": "'text/html'"
                 },
               }
             },
             "requestTemplates": {
               "application/json": "{\"statusCode\": 200}"
             },
             "passthroughBehavior": "when_no_match"
           }
         },
         ...
      }
   ```

1.  メソッドの認可にアクセストークンを使用するには、上記のセキュリティ定義を `{ "MyUserPool": [resource-server/scope, ...] }` に変更します。

   ```
     "paths": {
       "/": {
         "get": {
           "consumes": [
             "application/json"
           ],
           "produces": [
             "text/html"
           ],
           "responses": {
             "200": {
               "description": "200 response",
               "headers": {
                 "Content-Type": {
                   "type": "string"
                 }
               }
             }
           },
           "security": [
             {
               "MyUserPool": ["https://my-petstore-api.example.com/cats.read", "http://my.resource.com/file.read"]
             }
           ],        
           "x-amazon-apigateway-integration": {
             "type": "mock",
             "responses": {
               "default": {
                 "statusCode": "200",
                 "responseParameters": {
                   "method.response.header.Content-Type": "'text/html'"
                 },
               }
             },
             "requestTemplates": {
               "application/json": "{\"statusCode\": 200}"
             },
             "passthroughBehavior": "when_no_match"
           }
         },
         ...
      }
   ```

1. 必要に応じて、OpenAPI 定義または拡張機能を使用し、他の API 設定を指定します。詳細については、「[API Gateway の OpenAPI 拡張機能](api-gateway-swagger-extensions.md)」を参照してください。

# Amazon Cognito ユーザープールと統合された REST API を呼び出す
ユーザープールに統合された REST API を呼び出す

設定されたユーザープールオーソライザーを使用して、メソッドを呼び出すには、クライアントは以下を実行する必要があります。
+ ユーザープールにサインアップすることを可能にします。
+ ユーザープールにサインインすることを可能にします。
+ ユーザープールからサインインしているユーザーの [ID またはアクセストークン](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html)を取得します。
+ `Authorization` ヘッダー (または、オーソライザー作成時に指定した別のヘッダー) にトークンを含めます。

これらのタスクは、[AWS Amplify]() Amplify を使用して実行できます。詳細については、「[Integrating Amazon Cognito With Web and Mobile Apps (Amazon Cognito をウェブアプリおよびモバイルアプリとの統合) ](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-integrate-apps.html)」を参照してください。
+ Android の場合は、「[ Getting Started with Amplify for Android (Android 用 Amplify の使用開始) ](https://docs.amplify.aws/android/build-a-backend/auth/)」を参照してください。
+ iOS を使用するには、「[Getting started with Amplify for iOS (iOS 版 Amplify の使用開始) ](https://docs.amplify.aws/swift/build-a-backend/auth/)」を参照してください。
+ JavaScript を使用するには、「[Getting Started with Amplify for Javascript (Javascript のアンプリファイの使用開始 ) ](https://docs.amplify.aws/javascript/build-a-backend/auth/)」を参照してください。

# API Gateway コンソールを使用して REST API 用のクロスアカウントの Amazon Cognito オーソライザーを設定する
REST API 用のクロスアカウントの Amazon Cognito オーソライザーを設定する

Amazon Cognito ユーザープールは、API オーソライザーとは異なる AWS アカウントからも使用できるようになりました。Amazon Cognito ユーザープールでは、OAuth や SAML などのベアラートークン認証戦略を使用できます。これにより、複数の API Gateway API 間で簡単に一元管理し、主要な Amazon Cognito ユーザープールオーソライザーを共有できるようになります。

このセクションでは、Amazon API Gateway コンソールを使用して、クロスアカウント Amazon Cognito ユーザープールを設定する方法について説明します。

これらの手順は、AWS アカウントに API Gateway API、別のアカウントに Amazon Cognito ユーザープールが設定されていることを前提としています。

## REST API のクロスアカウント Amazon Cognito オーソライザーを作成する


API を設定しているアカウントで Amazon API Gateway コンソールにサインインし、以下の操作を行います。

1. 新しい API を作成、または API Gateway に既存の API を選択します。

1. メインナビゲーションペインで、**[オーソライザー]** を選択します。

1. **[オーソライザーの作成]** を選択します。

1. ユーザープールを使用するように新しいオーソライザーを設定するには、次の手順を実行します。

   1.  **[オーソライザー名]** に名前を入力します。

   1. **[オーソライザータイプ]** には、**[Cognito]** を選択します。

   1. **[Cognito ユーザープール]** で、2 番目のアカウントで作成したユーザープールの完全な ARN を入力します。
**注記**  
Amazon Cognito コンソールでは、ユーザープールの ARN は、[**全般設定**] ペインの [**プール ARN**] フィールドにあります。

   1.  ユーザーがサインインした際に Amazon Cognito が返す ID またはアクセストークンを渡すように、**[トークンソース]** には、ヘッダー名として **Authorization** と入力します。

   1. (オプション) 必要に応じて **[トークン検証]** フィールドに正規表現を入力して、リクエストが Amazon Cognito で承認される前に ID トークンの `aud` (対象者) フィールドを検証します。アクセストークンを使用する場合、この検証では、アクセストークンが `aud` フィールドを含まないために要求が拒否されることに注意してください。

   1. **[オーソライザーの作成]** を選択します。

# CloudFormation を使用して REST API の Amazon Cognito オーソライザーを作成する


CloudFormation を使用して、Amazon Cognito ユーザープールと Amazon Cognito オーソライザーを作成できます。この例の CloudFormation テンプレートでは、次のような処理を実行します。
+ Amazon Cognito ユーザープールを作成します。クライアントは、まずユーザーをユーザープールにサインインし、[ID トークンまたはアクセストークン](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html)を取得する必要があります。アクセストークンを使用して API メソッド呼び出しを承認している場合は、特定のリソースサーバーに必要なカスタムスコープを設定するために、ユーザープールとのアプリケーション統合を設定するようにしてください。
+ `GET` メソッドを使用して API Gateway API を作成します。
+ `Authorization` ヘッダーをトークンソースとして使用する Amazon Cognito オーソライザーを作成します。

```
AWSTemplateFormatVersion: 2010-09-09
Resources:
  UserPool:
    Type: AWS::Cognito::UserPool
    Properties:
      AccountRecoverySetting:
        RecoveryMechanisms:
          - Name: verified_phone_number
            Priority: 1
          - Name: verified_email
            Priority: 2
      AdminCreateUserConfig:
        AllowAdminCreateUserOnly: true
      EmailVerificationMessage: The verification code to your new account is {####}
      EmailVerificationSubject: Verify your new account
      SmsVerificationMessage: The verification code to your new account is {####}
      VerificationMessageTemplate:
        DefaultEmailOption: CONFIRM_WITH_CODE
        EmailMessage: The verification code to your new account is {####}
        EmailSubject: Verify your new account
        SmsMessage: The verification code to your new account is {####}
    UpdateReplacePolicy: Retain
    DeletionPolicy: Retain
  CogAuthorizer:
    Type: AWS::ApiGateway::Authorizer
    Properties:
      Name: CognitoAuthorizer
      RestApiId:
        Ref: Api
      Type: COGNITO_USER_POOLS
      IdentitySource: method.request.header.Authorization
      ProviderARNs:
        - Fn::GetAtt:
            - UserPool
            - Arn
  Api:
    Type: AWS::ApiGateway::RestApi
    Properties:
      Name: MyCogAuthApi
  ApiDeployment:
    Type: AWS::ApiGateway::Deployment
    Properties:
      RestApiId:
        Ref: Api
    DependsOn:
      - CogAuthorizer
      - ApiGET
  ApiDeploymentStageprod:
    Type: AWS::ApiGateway::Stage
    Properties:
      RestApiId:
        Ref: Api
      DeploymentId:
        Ref: ApiDeployment
      StageName: prod
  ApiGET:
    Type: AWS::ApiGateway::Method
    Properties:
      HttpMethod: GET
      ResourceId:
        Fn::GetAtt:
          - Api
          - RootResourceId
      RestApiId:
        Ref: Api
      AuthorizationType: COGNITO_USER_POOLS
      AuthorizerId:
        Ref: CogAuthorizer
      Integration:
        IntegrationHttpMethod: GET
        Type: HTTP_PROXY
        Uri: http://petstore-demo-endpoint.execute-api.com/petstore/pets
Outputs:
  ApiEndpoint:
    Value:
      Fn::Join:
        - ""
        - - https://
          - Ref: Api
          - .execute-api.
          - Ref: AWS::Region
          - "."
          - Ref: AWS::URLSuffix
          - /
          - Ref: ApiDeploymentStageprod
          - /
```