5. curl で トークンエンドポイント

得られた認可コードをトークンエンドポイントに送りトークンを得るために、以下の ⑤ を curl で行います。

⑤ トークンエンドポイントに認可コードを送る

サーバサイドアプリケーションの代わりに、curl でトークンエンドポイントに認可コードを送ります。

ターミナルや Powershell で以下の内容を < > 部分を書き換えて入力て実行します。<domain-name> は Cognito に割り当てたドメイン名に置き換えます。Cognito ドメイン名を設定 で設定しました。<app-client-id> は 2 箇所あり、両方をアプリクライアントのうち Confidential クライアントのアプリクライアント ID に置き換えます。<app-client-secret> は同じアプリクライアントのシークレットで置き換えます。<auth-code> はブラウザのアドレスバーからコピーした認可コードに置き換えます。

Mac / Linux の場合
curl --location \
--request POST 'https://<domain-name>.auth.ap-northeast-1.amazoncognito.com/token' \
-u <app-client-id>:<app-client-secret> \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=authorization_code' \
--data-urlencode 'client_id=<app-client-id>' \
--data-urlencode 'redirect_uri=http://localhost/' \
--data-urlencode 'code=<auth-code>'
Windows Powershell の場合
C:\Windows\System32\curl.exe --location `
--request POST 'https://<domain-name>.auth.ap-northeast-1.amazoncognito.com/token' `
-u <app-client-id>:<app-client-secret> `
--header 'Content-Type: application/x-www-form-urlencoded' `
--data-urlencode 'grant_type=authorization_code' `
--data-urlencode 'client_id=<app-client-id>' `
--data-urlencode 'redirect_uri=http://localhost/' `
--data-urlencode 'code=<auth-code>' `

成功した場合の出力を整形すると以下のような複数の種類のトークンが含まれた JSON となっています。id_tokenID トークンaccess_tokenアクセストークンrefresh_tokenリフレッシュトークンが含まれています。パラメータ間違い以外にエラーになる原因として、認可コードの有効期限切れがあります。サインインして時間が経ってしまっている場合は、サインインからやり直してください。

{
    "id_token": "?????.?????.?????",
    "access_token": "?????.?????.?????",
    "refresh_token": "?????????????????",
    "expires_in": 3600,
    "token_type": "Bearer"
}

これで Auth API を使ったサインインの操作は行えました。得られたトークンのうち、id_tokenaccess_token jwt.io のサイトでデコードして、内容を確認します。

ID トークン確認

トークンエンドポイントの呼び出し結果から id_token の値をコピーします。” は含めず、” と “ に囲まれた文字列をコピーします。id_token を見つけるのが難しい場合は、呼び出し結果全体を jsonlint.com に貼り付けて、 [Validate JSON] をクリックして整形してください。

https://jwt.io/ をブラウザで開いてください。以下のような入力画面が表示されるまで、下にスクロールしてください。最初はサンプルが入力されています。

[Encoded] にコピーした id_token の値を貼り付けます。[Decoded] の [PAYLOAD] にトークンの中身が表示されます。

アクセストークン確認

トークンエンドポイントの呼び出し結果から access_token の値をコピーします。こちらも “ は含めず、” と “ に囲まれた文字列をコピーします。access_token を見つけるのが難しい場合は、呼び出し結果全体を jsonlint.com に貼り付けて、 [Validate JSON] をクリックして整形してください。

https://jwt.io/ で、[Encoded] にコピーした access_token の値を貼り付けます。[Decoded] の [PAYLOAD] にトークンの中身が表示されます。

理解を深めるために、以下も試してみてください。

得られたトークンは 3. Cognito Identity Provider API の REST API アクセスでも利用できます。
一度 1-4. 認可エンドポイント を実施した後に、ブラウザを閉じずにもう一度認可エンドポイントを開くと、サインインせずにすぐにコールバック URL へリダイレクトされます。
コールバック URL を変更して、認可エンドポイントを開くとエラーになります。アプリクライアントのコールバック URL 設定に ";" 区切りで URL を追加すれば、利用できるようになります。