

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Acionador do Lambda para definir desafio de autenticação
<a name="user-pool-lambda-define-auth-challenge"></a>

O gatilho de desafio define auth é uma função do Lambda que mantém a sequência de desafios em um fluxo de autenticação personalizado. Ele declara o sucesso ou o fracasso da sequência de desafios e define o próximo desafio se a sequência ainda não estiver completa.

![\[Acionadores do Lambda de desafio\]](http://docs.aws.amazon.com/pt_br/cognito/latest/developerguide/images/lambda-challenges1.png)


**Definir o desafio de autenticação**  
 O Amazon Cognito invoca esse acionador para iniciar o [fluxo de autenticação personalizado](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-authentication-flow.html#amazon-cognito-user-pools-custom-authentication-flow).

A solicitação desse acionador do Lambda contém `session`. O parâmetro `session` é uma matriz que contém todos os desafios apresentados ao usuário no processo de autenticação atual. A solicitação também inclui o resultado correspondente. A matriz `session` armazena detalhes do desafio (`ChallengeResult`) em ordem cronológica. O desafio `session[0]` representa o primeiro que o usuário recebe.

**Topics**
+ [Parâmetros do acionador do Lambda para definir o desafio de autenticação](#cognito-user-pools-lambda-trigger-syntax-define-auth-challenge)
+ [Exemplo de definição do desafio de autenticação](#aws-lambda-triggers-define-auth-challenge-example)

## Parâmetros do acionador do Lambda para definir o desafio de autenticação
<a name="cognito-user-pools-lambda-trigger-syntax-define-auth-challenge"></a>

A solicitação que o Amazon Cognito transmite para essa função do Lambda é uma combinação dos parâmetros abaixo e dos [parâmetros comuns](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-working-with-lambda-triggers.html#cognito-user-pools-lambda-trigger-syntax-shared) que o Amazon Cognito adiciona a todas as solicitações.

------
#### [ JSON ]

```
{
    "request": {
        "userAttributes": {
            "string": "string",
                . . .
        },
        "session": [
            ChallengeResult,
            . . .
        ],
        "clientMetadata": {
            "string": "string",
            . . .
        },
        "userNotFound": boolean
    },
    "response": {
        "challengeName": "string",
        "issueTokens": boolean,
        "failAuthentication": boolean
    }
}
```

------

### Parâmetros de solicitação para definir o desafio de autenticação
<a name="cognito-user-pools-lambda-trigger-syntax-define-auth-challenge-request"></a>

 Quando o Amazon Cognito invoca sua função do Lambda, ele fornece os seguintes parâmetros:

**userAttributes**  
Um ou mais pares de nome-valor que representam atributos de usuário.

**userNotFound**  
Um booleano que é preenchido pelo Amazon Cognito quando `PreventUserExistenceErrors` é definido como `ENABLED` para o cliente de grupo de usuários. Um valor de `true` significa que o ID do usuário (nome de usuário, endereço de e-mail e outros detalhes) não correspondeu a nenhum usuário existente. Quando `PreventUserExistenceErrors` é definido como `ENABLED`, o serviço não informa a aplicação dos usuários inexistentes. Recomendamos que suas funções do Lambda mantenham a mesma experiência do usuário e contabilizem a latência. Dessa forma, o autor da chamada não consegue detectar comportamentos diferentes quando o usuário existe ou não existe.

**sessão**  
Uma matriz de elementos `ChallengeResult`. Cada regra contém os seguintes elementos:    
**challengeName**  
Um dos seguintes tipos de desafio: `CUSTOM_CHALLENGE`, `SRP_A`, `PASSWORD_VERIFIER`, `SMS_MFA`, `EMAIL_OTP`, `SOFTWARE_TOKEN_MFA`, `DEVICE_SRP_AUTH`, `DEVICE_PASSWORD_VERIFIER` ou `ADMIN_NO_SRP_AUTH`.  
Quando sua função define auth challenge emite um desafio `PASSWORD_VERIFIER` para um usuário que configurou a autenticação multifator, o Amazon Cognito prossegue com um desafio `SMS_MFA`, `EMAIL_OTP` ou `SOFTWARE_TOKEN_MFA`. Essas são as instruções para um código de autenticação multifator. Em sua função, inclua o tratamento de eventos de entrada de desafios `SMS_MFA`, `EMAIL_OTP` e `SOFTWARE_TOKEN_MFA`. Você não precisa invocar os desafios de MFA usando sua função de desafio define auth.  
Quando sua função estiver determinando se um usuário fez a autenticação com êxito e você precisar emitir tokens para ele, sempre confira `challengeName` em sua função “define auth challenge” e garantir que corresponda ao valor esperado.  
**challengeResult**  
Defina como `true` se o usuário tiver concluído o desafio com êxito; do contrário, defina-o como `false`.  
**challengeMetadata**  
Seu nome para o desafio personalizado. Usado somente se `challengeName` for `CUSTOM_CHALLENGE`.

**clientMetadata**  
Um ou mais pares de chave/valor que você pode fornecer como entrada personalizada para a função do Lambda especificada para o acionador definir desafio de autenticação. Para passar esses dados para sua função Lambda, você pode usar o `ClientMetadata` parâmetro nas operações [AdminRespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminRespondToAuthChallenge.html)e da [RespondToAuthChallenge](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_RespondToAuthChallenge.html)API. A solicitação que invoca a função define auth challenge não inclui dados transmitidos no ClientMetadata parâmetro [AdminInitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html)e [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html)operações de API.

### Parâmetros de resposta para definir o desafio de autenticação
<a name="cognito-user-pools-lambda-trigger-syntax-define-auth-challenge-response"></a>

Na resposta, você pode retornar o próximo estágio do processo de autenticação.

**challengeName**  
Uma string que contém o nome do próximo desafio. Se você deseja apresentar um novo desafio ao seu usuário, especifique o nome do desafio aqui.

**issueTokens**  
Se você determinar que o usuário concluiu os desafios de autenticação de forma adequada; defina-o como `true`. Se o usuário não cumprir os desafios devidamente, defina como `false`.

**failAuthentication**  
Se quiser encerrar o processo de autenticação atual, defina-o como `true`. Para continuar o processo de autenticação atual, defina-o como `false`.

## Exemplo de definição do desafio de autenticação
<a name="aws-lambda-triggers-define-auth-challenge-example"></a>

Este exemplo definirá uma série de desafios de autenticação e emitirá tokens somente se o usuário concluir todos os desafios com êxito. Quando os usuários concluem a autenticação SRP com os desafios `SRP_A` e `PASSWORD_VERIFIER`, essa função transmite a eles um `CUSTOM_CHALLENGE` que invoca o acionador do desafio de criação de autorização. Em combinação com nosso [exemplo de desafio de criação de autenticação](user-pool-lambda-create-auth-challenge.md#aws-lambda-triggers-create-auth-challenge-example), essa sequência oferece um desafio CAPTCHA para o desafio três e uma pergunta de segurança para o desafio quatro.

Depois que o usuário resolve o CAPTCHA e responde à pergunta de segurança, essa função confirma que seu grupo de usuários pode emitir tokens. A autenticação SRP não é necessária; você também pode definir o CAPTCHA e a pergunta de segurança como desafios um e dois. Caso sua função de definição de desafio de autenticação não declare desafios de SRP, o sucesso de seus usuários será determinado inteiramente pelas respostas deles aos seus prompts personalizados.

------
#### [ Node.js ]

```
const handler = async (event) => {
  if (
    event.request.session.length === 1 &&
    event.request.session[0].challengeName === "SRP_A"
  ) {
    event.response.issueTokens = false;
    event.response.failAuthentication = false;
    event.response.challengeName = "PASSWORD_VERIFIER";
  } else if (
    event.request.session.length === 2 &&
    event.request.session[1].challengeName === "PASSWORD_VERIFIER" &&
    event.request.session[1].challengeResult === true
  ) {
    event.response.issueTokens = false;
    event.response.failAuthentication = false;
    event.response.challengeName = "CUSTOM_CHALLENGE";
  } else if (
    event.request.session.length === 3 &&
    event.request.session[2].challengeName === "CUSTOM_CHALLENGE" &&
    event.request.session[2].challengeResult === true
  ) {
    event.response.issueTokens = false;
    event.response.failAuthentication = false;
    event.response.challengeName = "CUSTOM_CHALLENGE";
  } else if (
    event.request.session.length === 4 &&
    event.request.session[3].challengeName === "CUSTOM_CHALLENGE" &&
    event.request.session[3].challengeResult === true
  ) {
    event.response.issueTokens = true;
    event.response.failAuthentication = false;
  } else {
    event.response.issueTokens = false;
    event.response.failAuthentication = true;
  }

  return event;
};

export { handler };
```

------