API Gateway REST API で、Amazon Cognito ユーザープールをオーソライザーとしてセットアップするにはどうすればよいですか?

最終更新日: 2021 年 3 月 30 日

Amazon API Gateway REST API で、Amazon Cognito ユーザープールをオーソライザーとしてセットアップしたいと考えています。その方法を教えてください。

簡単な説明

API Gateway REST API で Amazon Cognito ユーザープールをオーソライザーとしてセットアップするには、次の 2 つの方法があります。

認証には、ID トークンまたはアクセストークンのいずれかを使用できます。詳細については、「ユーザープールのトークンの使用」を参照してください。

注: Amazon Cognito によって発行されたアクセストークンID トークンのクレーム (および追加クレーム) を検証するには、Lambda オーソライザーを使用します。アクセストークンを使用して API メソッド呼び出しを承認する場合は、Amazon Cognito のカスタムスコープを使用して API へのアクセスを承認するようにしてください。

詳細については、「ユーザープール用のリソースサーバーの定義」および「REST API 用の Amazon Cognito ユーザープールの作成」を参照してください。

解決方法

次の手順は、COGNITO_USER_POOLS オーソライザーを作成する方法を示しています。この例では、既に次の 2 つのものを作成していることを前提としています。

COGNITO_USER_POOLS オーソライザーの作成

詳細については、「REST API と Amazon Cognito ユーザープールの統合」を参照してください。

新しい COGNITO_USER_POOLS オーソライザーのテスト

COGNITO_USER_POOLS オーソライザーを作成したら、次の手順を実行します。

1.    API Gateway コンソールで、新しいオーソライザーの下にある [テスト] ボタンを選択します。

2.    [テスト] ウィンドウの [認証] に、新しい Amazon Cognito ユーザープールの ID トークンを入力します。

3.    [テスト] を選択します。

注: ID トークンが正しい場合、テストは 200 レスポンスコードを返します。ID トークンが正しくない場合は 401 レスポンスコードを返します。

API メソッドでの COGNITO_USER_POOLS オーソライザーの設定

詳細については、「 REST API と Amazon Cognito ユーザープールを統合する」の「 メソッドで COGNITO_USER_POOLS オーソライザーを設定するには」セクションを参照してください。

認証トークンの取得

認証トークンを取得するには、次の 4 つの方法があります。

注: Amazon Cognito のホストされたウェブ UI と認証コードの付与タイプを使用する場合は、取得したコードをトークンエンドポイントと交換する必要があります。

暗黙的付与タイプを使用している場合は、コールバック URL から付与を受けることができます。コールバック URL には、暗黙的なフローのアクセストークンと ID トークンパラメータが追加されます。使用することにしたトークンの種類に基づいて、正しいトークンを使用していることを確認します。

Amazon Cognito のホストされたウェブ UI を使用して認証トークンを取得するには

認証コード付与フローを使用するには、次の手順を実行します。

注: 認証コード付与フローを使用するときは、レスポンスタイプパラメーターは「code」である必要があります。

1.    次の URL に HTTP GET リクエストを送信します

重要: <your_domain> をユーザープールのドメイン名に置き換えてください。<your_app_client_id> をユーザープールのアプリクライアント ID に置き換えてください。<your_callback_url> をコールバック URL に置き換えてください。

https://<your_domain>/authorize?response_type=code&client_id=<your_app_client_id>&redirect_uri<your_callback_url>

注: identity_provider パラメータを含めると、エンドポイントはフェデレーション ID プロバイダーにリダイレクトされます。アプリケーションクライアントが Amazon Cognito ユーザープールにのみ設定されている場合、次のエンドポイントは /login エンドポイントにリダイレクトされます。

https://<your_domain>/login?response_type=code&client_id=<your_app_client_id>&redirect_uri=<your_callback_url>

2.    ユーザープールまたはフェデレーション ID プロバイダーにログインします。UI は、アプリクライアントのコールバックで指定された URL にリダイレクトされます。

重要: リダイレクト URL には認証コードが含まれています。認証コードは、有効なトークンを取得するためにトークンエンドポイントと交換する必要があります。

3.    HTTP POST リクエスト/oauth2/token エンドポイントに送信します。詳細については、「トークンのエンドポイント」を参照してください。

HTTP POST リクエストの例

注: 次の HTTP Post リクエスト例では、次の /oauth2/token エンドポイントを使用します。https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/token&

Content-Type='application/x-www-form-urlencoded'&
Authorization=Basic aSdxd892iujendek328uedj
grant_type=authorization_code&
client_id=djc98u3jiedmi283eu928&
code=AUTHORIZATION_CODE&
redirect_uri=com.myclientapp://myclient/redirect

HTTP Post リクエストレスポンスの例

HTTP/1.1 200 OKContent-Type: application/json
{ 
"access_token":"eyJz9sdfsdfsdfsd", 
"refresh_token":"dn43ud8uj32nk2je", 
"id_token":"dmcxd329ujdmkemkd349r",
"token_type":"Bearer", 
"expires_in":3600
}

暗黙的付与フローを使用するには、次の手順を実行します。

注: 暗黙的付与フローを使用する場合、レスポンスタイプパラメータは「token」である必要があります。

1.    次の URL に HTTP GET リクエストを送信します。 

重要: <your_domain> をユーザープールのドメイン名に置き換えてください。<your_app_client_id> をユーザープールのアプリクライアント ID に置き換えてください。<your_callback_url> をコールバック URL に置き換えます。

https://<your_domain>/authorize?response_type=token&client_id=<your_app_client_id> &redirect_uri=<your_callback_url>

注: identity_provider パラメータを含めると、エンドポイントはフェデレーション ID プロバイダーにリダイレクトされます。アプリケーションクライアントが Amazon Cognito ユーザープールにのみ設定されている場合、次のエンドポイントは /login エンドポイントにリダイレクトされます。

https://<your_domain>/login?response_type=token&client_id=<your_app_client_id> &redirect_uri=<your_callback_url>

2.    既存のユーザーのユーザー名とパスワードを使用してユーザープールにログインするか、ログイン用の新しいユーザーを作成します。UI は、アプリクライアントのコールバックで指定された URL にリダイレクトされます。

注: リダイレクト URL には、ID トークンアクセストークンが含まれます。

リダイレクト URL の例

https://www.example.com/#id_token=123456789idtoken123456789&access_token=123456789accesstoken123456789expires_in=3600&token_type=Bearer

AWS CLI を使用して認証トークンを取得するには

注: AWS CLI コマンドの実行時にエラーが発生した場合は、最新バージョンの AWS CLI を使用していることを確認してください

次のように、AWS CLI コマンド initiate-auth を実行します。

重要: auth-flow--client-id、および --auth-parameters の値を使用している入力情報で置き換えてください

aws cognito-idp initiate-auth --auth-flow USER_PASSWORD_AUTH --auth-parameters USERNAME=testuser,PASSWORD=P@ssw0rd --client-id <app client id>

AWS CLI コマンドレスポンス initiate-auth の例

Response: {
"AuthenticationResult": {
"ExpiresIn": 3600,
"IdToken": "dmcxd329ujdmkemkd349r",
"RefreshToken": "dn43ud8uj32nk2je"",
"TokenType": "Bearer",
"AccessToken": "eyJz9sdfsdfsdfsd"
},
"ChallengeParameters":
            {} 
}

AWS SDK の 1 つを使用して認証トークンを取得するには

詳細については、「Amazon Cognito をウェブアプリおよびモバイルアプリと統合する」を参照してください。

Postman を使用して認証トークンを取得するには

認証トークンを取得するには、Postman で Oauth 2.0 認証モードを使用します。詳細については、「 Amazon Cognito ユーザープールを設定した後、API Gateway REST API エンドポイントからの 401 Unauthorized エラーをトラブルシューティングするにはどうすればよいですか?」を参照してください。