Como soluciono erros “Não foi possível verificar o hash de segredo do cliente” da minha API de grupos de usuários do Amazon Cognito?

3 minuto de leitura
0

Quando tento acessar minha API de grupos de usuários do Amazon Cognito, recebo o erro “Não foi possível verificar o hash de segredo do cliente”. Quero solucionar esse problema.

Resolução

Ao configurar seu cliente de aplicação do grupo de usuários como um segredo de cliente, você deve incluir um valor de hash de segredo no parâmetro de consulta da API. Caso contrário, o Amazon Cognito retornará o erro Não foi possível verificar o hash de segredo do cliente.

Para resolver o problema, calcule o valor do hash de segredo. Em seguida, inclua o valor ao invocar APIs do Amazon Cognito que aceitam hash de segredo, como InitiateAuth ou ForgotPassword.

Observação: se você receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), consulte Solução de erros da AWS CLI. Além disso, verifique se você está usando a versão mais recente da AWS CLI.

Calcular o valor de hash de segredo

Para calcular o valor do hash de segredo, são necessárias as seguintes informações:

  • ID do cliente de aplicação
  • Segredo do cliente de aplicação
  • Nome de usuário do usuário que está no grupo de usuários do Amazon Cognito

Para automatizar o processo, conclua as seguintes etapas:

  1. Baixe a versão mais recente do Python para Windows no site do Python. Em seguida, instale o Python em sua máquina local.
  2. Salve o seguinte exemplo de script Python como um arquivo .py. Por exemplo, salve o arquivo como secret_hash.py. O script a seguir usa o segredo do cliente de aplicação como chave e a função de hash SHA256 para mostrar o cálculo de um resumo do HMAC:
    import sys, hmac, hashlib, base64
    
    # Unpack command line arguments
    username, app_client_id, key = sys.argv[1:4]
    
    # Create message and key bytes
    message, key = (username + app_client_id).encode('utf-8'), key.encode('utf-8')
    
    # Calculate secret hash
    secret_hash = base64.b64encode(hmac.new(key, message, digestmod=hashlib.sha256).digest()).decode()
    
    print(f"Secret Hash for user '{username}': {secret_hash}")
    
    Observação: substitua username pelo nome de usuário do usuário que está no grupo de usuários. Além disso, substitua app_client_id do cliente de aplicação do grupo de usuários e key pelo segredo do cliente de aplicação.
  3. Para obter o valor do hash de segredo, execute o seguinte comando:
    python3 secret_hash.py username app_client_id app_client_secret
    Observação: se você estiver executando uma versão do Python anterior ao Python 3.0, substitua python3 por python. Substitua secret_hash.py pelo nome do arquivo, username pelo nome de usuário do grupo de usuários, app_client_id pelo ID do cliente de aplicação e app_client_secret pelo segredo do cliente de aplicação.

Incluir valores de hash de segredo em chamadas de API

Adicione o valor de hash de segredo como um parâmetro SECRET_HASH nos parâmetros da string de consulta da chamada de API.

Exemplo de chamada de API InitiateAuth que inclui um parâmetro SECRET_HASH:

aws cognito-idp initiate-auth --auth-flow USER_PASSWORD_AUTH --auth-parameters USERNAME=username,PASSWORD=password,SECRET_HASH=secret_hash --client-id example_client-id

Exemplo de resposta da chamada de API InitiateAuth:

{    
    "ChallengeParameters": {},

    "AuthenticationResult": {
        "AccessToken": "<HIDDEN>",
        "ExpiresIn": 3600,
        "TokenType":
    "Bearer",

        "RefreshToken": "<HIDDEN>",
        "IdToken": "<HIDDEN>"
    }
}

Observação: se você usar o fluxo de autenticação USER_PASSWORD_AUTH, ative ALLOW_USER_PASSWORD_AUTH para o cliente de aplicação.

Exemplo de chamada de API ForgotPassword que inclui um parâmetro SECRET_HASH:

aws cognito-idp forgot-password --client-id example_client-id --username example_username --secret-hash example_secret-hash

Observação: substitua username por seu nome de usuário e secret-hash pelo valor do hash de segredo.

Exemplo de resposta da chamada de API ForgotPassword:

{    
    "CodeDeliveryDetails": {
        "Destination": "+***********",
        "DeliveryMedium": "SMS",
        "AttributeName": "phone_number"
    }
}
AWS OFICIAL
AWS OFICIALAtualizada há 3 meses