はじめに

AWS CLIでCognitoユーザーのアクセストークン/IDトークンを取得しようとしました。
しかしながら、以下の様なエラーが発生しました。

An error occurred (NotAuthorizedException) when calling the AdminInitiateAuth operation: Client ************************ is configured with secret but SECRET_HASH was not received

ここではこの事象の原因、解決策について記載したく思います。

実行しようとしていたコマンドの内容

記事を参考に以下コマンドを実行しました。[1]

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}

コマンドを実行することで以下の様なパラメーターを取得できることを期待していました。
その他にもCognito用に便利なコマンドがあるので、気になった方は公式ドキュメントを確認して下さい。
[1]AWS CLI Command Reference – cognito-idp
https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/index.html#cli-aws-cognito-idp

{
"ChallengeParameters": {},
"AuthenticationResult": {
"AccessToken": "*****",
"ExpiresIn": 300,
"TokenType": "Bearer",
"RefreshToken": "*****",
"IdToken": "*****"
}
}

エラー原因

エラー原因は「admin-initiate-auth」コマンドを実行する際に「SECRET_HASH」オプションを付与していなかったからでした。

Cognitoユーザープールのアプリケーションクライアントで「クライアントのシークレット」を作成する設定としていた場合、
「SECRET_HASH」のオプションを付与する必要があります。

クライアントのシークレットを作成する設定をしている場合には、公式ドキュメントにも記載がありますが、「SECRET_HASH」のオプションをつける必要があります。

解決策

「SECRET_HASH」のオプションをつけたコマンドは以下の様になります。

$ aws cognito-idp admin-initiate-auth \
--user-pool-id \
--client-id \
--auth-flow ADMIN_USER_PASSWORD_AUTH \
--auth-parameters "USERNAME=xxx,PASSWORD=yyy,SECRET_HASH=zzz"

まとめ

Cognitoを利用するのは初めてだったので、エラー内容を理解するのに時間がかかりました。