當嘗試叫用 Amazon Cognito 使用者集區 API 時,出現 "Unable to verify secret hash for client <client-id>" 錯誤。如何解決此錯誤?
簡短描述
當使用者集區應用程式用戶端在使用者集區中設定用戶端機密時,API 查詢引數需要 SecretHash 值。如果 API 查詢引數未提供密碼雜湊,則 Amazon Cognito 會傳回**Unable to verify secret hash for client <client-id>**錯誤。
下列範例顯示如何建立 SecretHash 值,並將其包含在 InitiateAuth 或 ForgotPassword API 呼叫中。
解決方法
**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤,請確保您使用的是最新版本 AWS CLI。
建立 SecretHash 值
請遵循運算 SecretHash 值中的說明進行操作。您需要應用程式用戶端 ID、應用程式用戶端機密,以及 Amazon Cognito 使用者集區使用者的使用者名稱。
-或-
若要自動化此程序,請執行下列操作:
1. 如果您尚未安裝 Python,請安裝。
2. 將下列範例 Python 指令碼 儲存為 .py 檔案:
import sys
import hmac, hashlib, base64
username = sys.argv[1]
app_client_id = sys.argv[2]
key = sys.argv[3]
message = bytes(sys.argv[1]+sys.argv[2],'utf-8')
key = bytes(sys.argv[3],'utf-8')
secret_hash = base64.b64encode(hmac.new(key, message, digestmod=hashlib.sha256).digest()).decode()
print("SECRET HASH:",secret_hash)
注意:在執行範例指令碼之前,請先取代下列值: 對於使用者名稱,輸入使用者集區中使用者的使用者名稱。對於 app_client_id,輸入您的使用者集區的應用程式用戶端 ID。對於金鑰,輸入您應用程式用戶端的機密。
3. 執行下列命令以執行指令碼:
python3 secret_hash.py <username> <app_client_id> <app_client_secret>
注意:在執行命令之前,請先取代下列值: 如果您執行的是 Python 3.0 之前的版本,請將 python3 取代為 python。對於 secret_hash.py,輸入範例指令碼的檔案名稱。對於使用者名稱,輸入使用者集區使用者名稱。對於 app_client_id,輸入您的應用程式用戶端 ID;對於 app_client_secret,輸入您的應用程式用戶端機密。
命令回應會傳回 SecretHash 值。
在 API 呼叫中包含 SecretHash 值
**注意:**如果您的應用程式用戶端未設定應用程式用戶端機密,則 Amazon Cognito API 呼叫無需 SecretHash 值。如需詳細資訊,請參閱設定使用者集區應用程式用戶端。
將您建立的 SecretHash 值作為 SECRET_HASH 參數新增在 API 呼叫的查詢字串參數中。
範例包含 SECRET_HASH 參數的 InitiateAuth API 呼叫
$ aws cognito-idp initiate-auth --auth-flow USER_PASSWORD_AUTH --auth-parameters USERNAME=<username>,PASSWORD=<password>,SECRET_HASH=<secret_hash> --client-id <client-id>
範例 InitiateAuth API 呼叫回應
{
"ChallengeParameters": {},
"AuthenticationResult": {
"AccessToken": "<HIDDEN>",
"ExpiresIn": 3600,
"TokenType":
"Bearer",
"RefreshToken": "<HIDDEN>",
"IdToken": "<HIDDEN>"
}
}
**注意:**如果您正在使用 USER_PASSWORD_AUTH 驗證流程,請確保 ALLOW_USER_PASSWORD_AUTH 已開啟。
範例 ForgotPassword API 呼叫,其中包含 SECRET_HASH 參數
$ aws cognito-idp forgot-password --client-id <client-id> --username <username> --secret-hash <secret-hash>
範例 ForgotPassword API 呼叫回應
{
"CodeDeliveryDetails": {
"Destination": "+***********",
"DeliveryMedium": "SMS",
"AttributeName": "phone_number"
}
}