😊

【Cognito】SECRET_HASHをshellで払い出す方法

2022/01/29に公開

答えだけ知りたい方向け

SECRET_HASHの払い出し

$ echo -n "<username><app_client_id>" | openssl dgst -sha256 -hmac "<key>" -binary | base64
#=> zzz

パラメータにSECRET_HASHを付与したCognito認証の例

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



1. はじめに

Cognitoでアプリクライアントを作成する際には標準で「クライアントシークレットを生成」オプションがONになっています。

この状態でアプリクライアントを作成すると、「アプリクライアントのシークレット」が払い出させ、ユーザ認証の際にSECRET_HASHが認証パラメータとして必要となります。

▼アプリクライアント作成画面▼

▼アプリクライアント画面▼



2. 認証方法

「アプリクライアントのシークレット」が払い出されてない場合

以下は、admin-initiate-auth コマンドの例になりますが、「アプリクライアントのシークレット」が払い出されてない場合は、USERNAMEPASSWORDだけで認証することができます。

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

「アプリクライアントのシークレット」が払い出されてる場合

「アプリクライアントのシークレット」が払い出されてる場合は、USERNAMEPASSWORDに加えてSECRET_HASHが認証パラメータに必要となります。

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



3. SECRET_HASHの払い出し

AWSのドキュメントから、SECRET_HASHの払い出しには、「Username + Client Id」を「Client Secret Key」でHMAC_SHA256(ハッシュ)化したうえで、Base64に変換する必要があると記載されてます。

Base64 ( HMAC_SHA256 ( "Client Secret Key", "Username" + "Client Id" ) )

https://aws.amazon.com/jp/premiumsupport/knowledge-center/cognito-unable-to-verify-secret-hash/
https://docs.aws.amazon.com/cognito/latest/developerguide/signing-up-users-in-your-app.html#cognito-user-pools-computing-secret-hash

shellコマンドでSECRET_HASHを払い出す方法

AWSのドキュメントにはPythonやJavaでSECRET_HASHを払い出すサンプルコードが掲載されてますが、shellの場合は以下のコマンドで払い出せます。

$ echo -n "<username><app_client_id>" | openssl dgst -sha256 -hmac "<key>" -binary | base64
#=> zzz



4. Cognito認証

払い出されたSECRET_HASHを認証パラメータに付与することで、「アプリクライアントのシークレット」が払い出されてるアプリクライアントでも認証できるようになります。

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



参考

hmac sha256 encode with url safe base64 in bash shell

Discussion