Amazon Cognito ユーザープールのカスタムスコープを使用して Amazon API Gateway の API リソースへのアクセスを許可したいと考えています。
簡単な説明
Amazon Cognito ユーザープールでカスタムスコープを持つリソースサーバーを定義します。次に、API リソースへのリクエストを認証するための、API Gateway の API の Amazon Cognito オーソライザーを作成して設定します。
API リソースへの異なるアクセスレベルを必要とするさまざまなアプリクライアントがある場合は、差別化されたアクセス範囲を定義できます。さまざまなアプリクライアントが必要とする詳細なアクセスレベルを検討し、それに応じて設計します。
解決策
次の前提条件を作成します。
カスタムスコープでリソースサーバーをユーザープールに追加する
1. Amazon Cognito コンソールを開きます。
2. リソースサーバーとカスタムスコープを定義します。
3. リソースサーバーを作成した後に、[アプリの統合] タブを選択します。
4. [アプリクライアントと分析] セクションから、アプリクライアントを選択します。
5. [ホストされた UI] セクションから [編集] を選択します。その後、以下の手順を実行します。
[OAuth 2.0 付与タイプ] のドロップダウンリストで、[暗黙的な付与] を選択します。
[カスタムスコープ] ドロップダウンリストで、定義したカスタムスコープを選択します。
注: カスタムスコープの形式は resourceServerIdentifier/scopeName です。クライアントが OAuth 2.0 フローでカスタムスコープをリクエストする場合、この形式のスコープの完全な識別子がリクエストに含まれている必要があります。
6. [変更を保存] を選択します。
モバイルアプリケーションにサーバー側コンポーネントがある場合は、認証コード付与フローと PKCE (Proof Key for Code Exchange) を使用します。認証コード付与フローを使用すると、トークンの安全性が高まり、エンドユーザーに直接公開されることがなくなります。
セットアップにサーバー側のロジックが含まれていない場合は、黙示的な付与フローを使用できます。黙示的な付与はリフレッシュトークンを生成しません。これにより、リフレッシュトークンがクライアントに公開されるのを防ぎます。リフレッシュトークンは、より長い有効性を持ち、より新しい ID およびアクセストークンを取得します。
重要: リフレッシュトークンをクライアント側の環境に保存しないでください。
詳細については、「アプリケーションクライアントの設定用語」を参照してください。Amazon Cognito ユーザープールの OAuth 2.0 の付与の詳細については、「Understanding Amazon Cognito user pool OAuth 2.0 grants」を参照してください。
オーソライザーを作成して API と統合する
次のステップを完了するには、REST API と Amazon Cognito ユーザープールを統合するための手順に従います。
1. オーソライザーを作成するには、「API Gateway コンソールを使用して COGNITO_USER_POOLS 認証を作成するには」の手順に従います。
注: 作成後、コンソールにオーソライザーをテストするオプションが表示されます。これには ID トークンが必要です。アクセストークンを使用してコンソールの外部でセットアップをテストするには、この記事の「テスト用のユーザープールのアクセストークンを取得する」セクションを参照してください。
2. オーソライザーを API と統合するには、「メソッドで COGNITO_USER_POOLS オーソライザーを設定するには」の手順に従います。
注:****OAuth スコープの場合は、カスタムスコープの完全な識別子を resourceServerIdentifier/scopeName の形式で入力します。
3. API をデプロイします。
テスト用のユーザープールのアクセストークンを取得する
ユーザープールのホストされたウェブ UI を使用してサインインし、Amazon Cognito 認証サーバーからアクセストークンを取得します。または、モバイルおよびウェブの AWS SDK で利用可能な OAuth 2.0 エンドポイント実装を使用してアクセストークンを取得します。
注: アプリケーションクライアントがホストされたウェブ UI を通じて認証をリクエストする場合、リクエストには、システム予約スコープ、またはカスタムスコープの任意の組み合わせを含めることができます。クライアントがスコープをリクエストしない場合、認証サーバーはクライアントに関連付けられたすべてのスコープを含むアクセストークンを返します。アプリケーションクライアントを設計する際は、不要な許可が付与されないように、リクエストに目的のスコープが含まれているようにしてください。
1. ウェブブラウザに次の URL を入力します。
https://yourDomainPrefix.auth.region.amazoncognito.com/login?response_type=token&client_id=yourClientId&redirect_uri=redirectUrl
注: yourDomainPrefix と region をユーザープールの値に置き換えてください。これらの値は、Amazon Cognito コンソールのユーザープールの [ドメイン名] タブで確認できます。
yourClientId をアプリケーションクライアントの ID に、redirectUrl をアプリケーションクライアントのコールバック URL に、それぞれ置き換えてください。これらの値は、ユーザープールの [アプリクライアント設定] タブのコンソールで確認できます。詳細については、「ログインエンドポイント」を参照してください。
2. 作成したユーザーとして、ユーザープールにサインインします。
3. アドレスバーの URL からアクセストークンをコピーします。このトークンは access_token= に続く長い文字列です。
テストとして API を呼び出す
テストとして、アクセストークンを認証ヘッダーの値として使用して、API を呼び出します。Postman アプリ (Postman ウェブサイト上) または curl コマンドをコマンドラインインターフェイスから使用できます。curl の詳細については、curl プロジェクトのウェブサイトをご覧ください。
curl を使用するには、次のコマンドを実行します。
curl https://restApiId.execute-api.region.amazonaws.com/stageName/resourceName -H "Authorization: accessToken"
注: restApiId は、API ID で置き換えてください。region は、API の AWS リージョンで置き換えてください。stageName は、 API がデプロイされているステージの名前で置き換えてください。resourceName は、API リソースの名前で置き換えてください。accessToken を、コピーしたトークンで置き換えます。詳細については、「Amazon API Gateway での REST API の呼び出し」を参照してください。
すべてを正しく設定した場合は、200 OK レスポンスコードが返されます。
関連情報
ユーザープールのアプリケーションクライアントの設定
アクセストークンスコープ (OAuth 2.0 認証フレームワーク)