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

2021.08.27

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、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_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ユーザー)のアクセストークンおよびIDトークンを取得してみました。

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

参考

以上