😊
【Cognito】SECRET_HASHをshellで払い出す方法
答えだけ知りたい方向け
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 コマンドの例になりますが、「アプリクライアントのシークレット」が払い出されてない場合は、USERNAMEとPASSWORDだけで認証することができます。
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"
「アプリクライアントのシークレット」が払い出されてる場合
「アプリクライアントのシークレット」が払い出されてる場合は、USERNAMEとPASSWORDに加えて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" ) )
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"
Discussion