🅰️
AWS CLI から Cognito で作成したユーザーにサインインしてトークンを取得する
Rails API モードで REST API を構築しています。
認証基盤としては Cognito を使用しております。
一部の API でトークンの検証を行いたかったので、コンソールからユーザーを作成し、
AWS CLI からサインインとパスワード認証を行い、トークンを取得しました。
準備するもの
- Cognito ユーザープール
- AWS CLI
- 適当な IAM ロール
- AmazonCognitoPowerUser ポリシーをアタッチしています
流れ
- ユーザー作成
- サインイン
- 確認
ユーザー作成(サインアップ)
対象のユーザープールからユーザーを作成します。
招待メッセージは「送信しない」、また、「E メールアドレスを検証済みとしてマークする」にチェックを入れてください。
メールアドレスとパスワードは任意のもので大丈夫です。
ちなみにユーザー作成も CLI から可能なのですが、テストユーザーしか作らないので、調べてないです。
参考にした記事ではサインアップからやっていました。
サインイン
下記コマンドを実行して、サインインを試みます。
user-pool-id
はユーザープールの概要から、client-id
は「アプリケーションの統合->アプリケーションクライアントのリスト」から確認できます。
aws cognito-idp admin-initiate-auth \
--user-pool-id region_xxxxxxx \
--client-id zzzzzzzzzzzzzzzzzzzzzzzzz \
--auth-flow ADMIN_USER_PASSWORD_AUTH \
--auth-parameters "USERNAME=<設定したメールアドレス>,PASSWORD=<設定したパスワード>"
パスワードの変更を要求された場合は、以下のようなレスポンスが返ってきます。
{
"ChallengeName": "NEW_PASSWORD_REQUIRED",
"Session": <とても長い文字列>,
"ChallengeParameters": {
"USER_ID_FOR_SRP": "xxxxxxxxxx-xxxxxxxx-xxxxxxxxx-xxxxx",
"requiredAttributes": "[]",
"userAttributes": "{\"email_verified\":\"true\",\"email\":\"mailaddress\"}"
}
}
パスワードを変更します。
session には、↑でえられた "Session" の値を入れて下さい。有効期限が設定されているので、期限切れになったら、最初のサインインからやり直してください。
aws cognito-idp admin-respond-to-auth-challenge \
--user-pool-id region_xxxxxxx \
--client-id zzzzzzzzzzzzzzzzzzzzzzzzz \
--challenge-name NEW_PASSWORD_REQUIRED \
--challenge-responses NEW_PASSWORD='<設定したメールアドレス>',USERNAME=username or mailaddress etc.\
--session "<とても長い文字列>"
確認
うまくいくと以下のようなレスポンスが得られます。
{
"ChallengeParameters": {},
"AuthenticationResult": {
"AccessToken": "とても.ながい.もじれつ",
"ExpiresIn": 3600,
"TokenType": "Bearer",
"RefreshToken": "めっちゃ.ながい.もじれつ",
"IdToken": "とても.ながい.もじれつ",
}
}
さいごに
IAM ロールのポリシーとセッション切れに注意します。
参考
Discussion