AWS CLIでCognitoユーザーのアクセストークン/IDトークンを取得する
こんにちは、CX事業本部 IoT事業部の若槻です。
今回は、AWS CLIでAmazon Cognito User Poolに登録されたユーザー(Cognitoユーザー)のアクセストークンおよびIDトークンを取得してみました。
最初に結論
下記のコマンドでCognitoユーザーのアクセストークンおよびIDトークンを取得できました。
$ aws cognito-idp admin-initiate-auth \ --user-pool-id ${userPoolId} \ --client-id ${clientId} \ --auth-flow "ADMIN_USER_PASSWORD_AUTH" \ --auth-parameters USERNAME=${userName},PASSWORD=${password}
ただし上記方法の場合は下記の条件を満たしている必要がありました。
- トークン取得対象のユーザーがConfirm済みであること
- User Pool Clientの
ALLOW_ADMIN_USER_PASSWORD_AUTH
が有効であること
トークンを取得する
準備
- Cognito User Poolの作成
$ poolName=sample-user-pool $ userPool=$(aws cognito-idp create-user-pool --pool-name ${poolName})
- User Pool IDの取得
$ userPoolId=$(echo ${userPool} | jq -r .UserPool.Id)
- User Pool Clientの作成
$ clientName=sample-client $ userPoolClient=$(aws cognito-idp create-user-pool-client --user-pool-id ${userPoolId} --client-name ${clientName})
- Client IDの取得
$ clientId=$(echo ${userPoolClient} | jq -r .UserPoolClient.ClientId)
- ユーザーの登録
$ userName=sampleuser $ password=${myPassword} $ aws cognito-idp sign-up \ --client-id ${clientId} \ --username ${userName} \ --password ${password}
取得できるまでの試行錯誤
ここではトークンを取得する方法を見るけるまでの試行錯誤について記しています。
- トークンの取得(InvalidParameterException)
Cognitoユーザーのトークン取得にはadmin-initiate-authコマンドを使用すれば良いとのことなので使ってみます。
$ aws cognito-idp admin-initiate-auth \ --user-pool-id ${userPoolId} \ --client-id ${clientId} \ --auth-flow "ADMIN_NO_SRP_AUTH" \ --auth-parameters USERNAME=${userName},PASSWORD=${password} An error occurred (InvalidParameterException) when calling the AdminInitiateAuth operation: Auth flow not enabled for this client
InvalidParameterExceptionとなりました。ADMIN_NO_SRP_AUTH
によるAuthフローはClientが対応していないようです。
- トークンの取得(InvalidParameterException)
ドキュメントを読むと、ADMIN_NO_SRP_AUTH
はADMIN_USER_PASSWORD_AUTH
に置き換えられたとのこと。
ADMIN_USER_PASSWORD_AUTH : Admin-based user password authentication. This replaces the ADMIN_NO_SRP_AUTH authentication flow. In this flow, Cognito receives the password in the request instead of using the SRP process to verify passwords.
そこで--auth-flow
の指定をADMIN_USER_PASSWORD_AUTH
に変更して再度admin-initiate-authを実行します。
$ aws cognito-idp admin-initiate-auth \ --user-pool-id ${userPoolId} \ --client-id ${clientId} \ --auth-flow "ADMIN_USER_PASSWORD_AUTH" \ --auth-parameters USERNAME=${userName},PASSWORD=${password} An error occurred (InvalidParameterException) when calling the AdminInitiateAuth operation: Auth flow not enabled for this client
またInvalidParameterExceptionとなりました。
- トークンの取得(UserNotConfirmedException)
Amazon Cognitoのダッシュボードでクライアントの設定を見てみると、[認証フローの設定]で認証用の管理 API のユーザー名パスワード認証を有効にする (ALLOW_ADMIN_USER_PASSWORD_AUTH)
が無効になっていました。チェックを入れて有効にします。
再度admin-initiate-authを実行します。
$ aws cognito-idp admin-initiate-auth \ --user-pool-id ${userPoolId} \ --client-id ${clientId} \ --auth-flow "ADMIN_USER_PASSWORD_AUTH" \ --auth-parameters USERNAME=${userName},PASSWORD=${password} An error occurred (UserNotConfirmedException) when calling the AdminInitiateAuth operation: User is not confirmed.
エラーが変わり、UserNotConfirmedExceptionとなりました。ユーザーのconfirmがされていないとのこと。
- ユーザーのconfirm
$ aws cognito-idp admin-confirm-sign-up \ --user-pool-id ${userPoolId} \ --username ${userName}
- トークンの取得(成功)
再度admin-initiate-authを実行します。
$ aws cognito-idp admin-initiate-auth \ --user-pool-id ${userPoolId} \ --client-id ${clientId} \ --auth-flow "ADMIN_USER_PASSWORD_AUTH" \ --auth-parameters USERNAME=${userName},PASSWORD=${password} { "ChallengeParameters": {}, "AuthenticationResult": { "AccessToken": "eyJraWQiOiJlUmh2bjJ4VFBcL0ZRM1BaZVRScWtlNFZF...", "ExpiresIn": 3600, "TokenType": "Bearer", "RefreshToken": "eyJjdHkiOiJKV1QiLCJlbmMiOiJBMjU2R0NNIiwiYWx...", "IdToken": "eyJraWQiOiJXTGN5YVdTSGZKSURIZlwveDlXRWFRXC9wM3dN..." } }
トークンを取得できました。
トークンを使ってみる
自身のアクセストークンを使ってユーザー情報を取得してみます。
$ accessToken=eyJraWQiOiJlUmh2bjJ4VFBcL0ZRM1BaZVRScWtlNFZF... $ aws cognito-idp get-user --access-token ${accessToken} { "Username": "sampleuser", "UserAttributes": [ { "Name": "sub", "Value": "f6121cd9-1ab0-4954-a380-b3315ed955ca" } ] }
ユーザー情報を取得できました。
おわりに
AWS CLIでAmazon Cognito User Poolに登録されたユーザー(Cognitoユーザー)のアクセストークンおよびIDトークンを取得してみました。
これにより、Cognitoユーザープールをオーソライザーとして使用したREST APIのE2Eテストを行いたい場合などに簡単にトークンを取得できるのが良いですね。
参考
- create-user-pool — AWS CLI 1.20.30 Command Reference
- create-user-pool-client — AWS CLI 1.20.30 Command Reference
- sign-up — AWS CLI 1.20.30 Command Reference
- admin-initiate-auth — AWS CLI 1.20.30 Command Reference
- AWS Cognito のユーザーが有効化できない FORCE_CHANGE_PASSWORD
- amazon web services - How to generate access token for an AWS Cognito user? - Stack Overflow
- /python
- get-user — AWS CLI 1.20.30 Command Reference
以上