如何對 Amazon Cognito 使用者集區 API 的 "Unable to verify secret hash for client <client-id>" 錯誤進行疑難排解?

2 分的閱讀內容
0

當嘗試叫用 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 值,並將其包含在 InitiateAuthForgotPassword 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"
    }
}

AWS 官方
AWS 官方已更新 3 年前