AWS CLIでCognitoユーザーのアクセストークンを取得する

2021.08.27

こんにちは、CX事業本部 IoT事業部の若槻です。

今回は、AWS CLIでAmazon Cognito User Poolに登録されたユーザー(Cognitoユーザー)のアクセストークンを取得してみました。

最初に結論

下記のコマンドでCognitoユーザーのアクセストークンを取得できました。

$ 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_AUTHADMIN_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ユーザー)のアクセストークンを取得してみました。

これにより、Cognitoユーザープールをオーソライザーとして使用したREST APIのE2Eテストを行いたい場合などに簡単にアクセストークンを取得できるのが良いですね。

参考

以上