ハンズオン内容の解説

Auth API の Authorization Code Grant フローでの呼び出しを Confidential クライアントから行います。Hosted UI を使うことになるため、ブラウザでのインタラクティブな操作が必要です。また、一般的には Confidential クライアントはシークレットがあるため、サーバサイドから呼び出しが出てきます。

本ハンズオンでは、ブラウザでの直接アクセス、Postman、curl コマンドを操作してトークン発行までを行います。

  1. 通常はサインインする時にアプリが Cognito の認可エンドポイントに画面遷移させます。本ハンズオンでは、ブラウザに直接 URL を入力して開きます。
  2. ブラウザで認可エンドポイントにアクセスすると、Hosted UI が表示されます。ただし、既にログイン済みの場合は Hosted UI が表示されず、4 に進みます。
  3. Hosted UI でユーザ登録し、確認コードを入力するか、既存ユーザでサインインします。
  4. サインインに成功すると、認可コードが付いた アプリの URL にリダイレクトされます。本ハンズオンでは、サーバサイドのアプリケーションは無いため http://localhost/ にリダイレクトするようにします。ブラウザのエラーが表示されますが、アドレスバーから認可コードを確認できます。
  5. URL に付けられた認可コードを Cognito のトークンエンドポイントに認可コードを渡し、トークンを受け取ります。本ハンズオンでは、この操作を Postman あるいは curl コマンドで行います。

認可エンドポイント

本ハンズオンでは ① でアクセスします。サインするためのエンドポイントで、開くと通常は Hosted UI が表示されます。サインインのみならず、ユーザ登録、確認コードの入力、パスワード忘れ時の対応、外部 IdP を使ったサインインなども行なえます。ユーザに行わせたい ID 関連の操作すべてを Hosted UI で行えるわけではないため、Cognito Identity Provider API も併用することが必要です。

このエンドポイントはブラウザで開きインタラクティブで操作することが前提でなっており、サインインが行えると、指定されたリダイレクト先にリダイレクトされます。API へのパラメータは、URL パラメータで送ります。

GET /oauth2/authorize

主なリクエストパラメータ

項目 意味
response_type 利用したい OAuth フローを指定します。code は Authorization Code Grant フローで、token は Implicit Grant フローを意味します。
client_id アプリクライアント ID
redirect_uri サインイン後にリダイレクトする先のアプリ URL

他にもいくつかパラメータがあるため、詳しくは Cognito 開発者ガイド - 認可エンドポイント を確認ください。特に、実利用ではセキュリティ強化のため code_challengestate も利用することが望ましいです。

トークンエンドポイント

本ハンズオンでは ⑤ でアクセスします。トークンエンドポイントは名前の通り、トークンを提供します。ハンズオンで行う Authorization Code Grant フローで使う場合は、サインイン後に得られた認可コードを送ることでトークンを得られます。加えて、リフレッシュトークンを送って新しいアクセストークン、ID トークンを得る使い方や Client Credetial フローでアプリクライアントとして認証することでトークンを得ることも可能です。

このエンドポイントはクライアントのバックグラウンドで呼び出す場合もサーバからアクセスする場合もあります。成功してもリダイレクトのレスポンスは返ってきません。API へのパラメータは、リクエストボディに URL エンコードして送ります。

POST /oauth2/token

主なリクエストパラメータ

項目 意味
grant_type トークン提供可否を確認する方法を指定します。authorization_code では認可コード、refresh_token ではリフレッシュトークン、client_credentials ではアプリクライアントのシークレットで確認します。
client_id アプリクライアントの ID
redirect_uri authorization_code の時に認可コード発行時に利用されたリダイレクト URL を指定します。
code authorization_code の時に認可コードを指定します。