😊
【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