

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á.

# Autenticação e autorização personalizadas
<a name="custom-authentication"></a>

 AWS IoT Core permite definir autorizadores personalizados para que você possa gerenciar sua própria autenticação e autorização do cliente. Isso é útil quando você precisa usar mecanismos de autenticação diferentes dos que oferecem suporte AWS IoT Core nativo. (Para obter mais informações sobre os mecanismos compatíveis, consulte [Autenticação de cliente](client-authentication.md)).  

 Por exemplo, se você estiver migrando dispositivos existentes no campo para AWS IoT Core e esses dispositivos usarem um token de portador personalizado ou nome de usuário e senha do MQTT para autenticação, você poderá migrá-los AWS IoT Core sem precisar provisionar novas identidades para eles. Você pode usar a autenticação personalizada com qualquer um dos protocolos de comunicação AWS IoT Core compatíveis. Para obter mais informações sobre protocolos compatíveis com o AWS IoT Core , consulte [Protocolos de comunicação do dispositivo](protocols.md). 

**Topics**
+ [Entender o fluxo de trabalho de autenticação personalizada](custom-authorizer.md)
+ [Criação e gerenciamento de autorizadores personalizados (CLI)](config-custom-auth.md)
+ [Autenticação personalizada com certificados de cliente X.509](custom-auth-509cert.md)
+ [AWS IoT Core Conectando-se usando autenticação personalizada](custom-auth.md)
+ [Solução de problemas dos autorizadores](custom-auth-troubleshooting.md)

# Entender o fluxo de trabalho de autenticação personalizada
<a name="custom-authorizer"></a>

A autenticação personalizada permite que você defina como autenticar e autorizar clientes usando [recursos do autorizador](https://docs.aws.amazon.com/iot/latest/apireference/API_AuthorizerDescription.html).  Cada autorizador contém uma referência a uma função do Lambda gerenciada pelo cliente, uma chave pública opcional para validar as credenciais do dispositivo e informações adicionais de configuração. O diagrama a seguir ilustra o fluxo de trabalho de autorização para autenticação personalizada no AWS IoT Core.

![\[Fluxo de trabalho de autorização personalizado para autenticação personalizada no AWS IoT Core.\]](http://docs.aws.amazon.com/pt_br/iot/latest/developerguide/images/custom-authentication.png)


## AWS IoT Core fluxo de trabalho personalizado de autenticação e autorização
<a name="custom-authentication-workflow"></a>

A lista a seguir explica cada etapa do fluxo de trabalho de autenticação e autorização personalizadas.

1. Um dispositivo se conecta ao endpoint de AWS IoT Core dados do cliente usando um dos compatíveis[Protocolos de comunicação do dispositivo](protocols.md). O dispositivo passa as credenciais nos campos de cabeçalho ou nos parâmetros de consulta da solicitação (para HTTP Publish ou MQTT sobre WebSockets protocolos) ou no campo de nome de usuário e senha da mensagem MQTT CONNECT (para os protocolos MQTT e MQTT over). WebSockets 

1. AWS IoT Core verifica uma das duas condições:
   + A solicitação recebida especifica um autorizador.
   + O endpoint de AWS IoT Core dados que recebe a solicitação tem um autorizador padrão configurado para ele.

   Se AWS IoT Core encontrar um autorizador de qualquer uma dessas formas, AWS IoT Core acionará a função Lambda associada ao autorizador.

1.  (Opcional) Se você habilitou a assinatura de token, AWS IoT Core valida a assinatura da solicitação usando a chave pública armazenada no autorizador antes de acionar a função Lambda. Se a validação falhar, o AWS IoT Core interromperá a solicitação sem invocar a função do Lambda.  

1. A função do Lambda recebe as credenciais e os metadados de conexão na solicitação e toma uma decisão de autenticação.

1. A função Lambda retorna os resultados da decisão de autenticação e um documento de AWS IoT Core política que especifica quais ações são permitidas na conexão. A função Lambda também retorna informações que especificam com que frequência AWS IoT Core revalida as credenciais na solicitação invocando a função Lambda.

1. AWS IoT Core avalia a atividade na conexão em relação à política que recebeu da função Lambda.

1. Depois que a conexão for estabelecida e o Lambda do seu autorizador personalizado for inicialmente invocado, a próxima invocação poderá ser adiada por até 5 minutos em conexões inativas sem nenhuma operação de MQTT. Depois disso, as invocações subsequentes seguirão o intervalo de atualização no Lambda do seu autorizador personalizado. Essa abordagem pode evitar invocações excessivas que podem exceder o limite de simultaneidade do Lambda do seu. Conta da AWS

## Considerações sobre dimensionamento
<a name="custom-authentication-scaling"></a>

 Uma vez que uma função do Lambda gerencia a autenticação e a autorização do seu autorizador, ela está sujeita aos limites de preços e serviços do Lambda, como a taxa de execução simultânea. Para obter mais informações sobre os preços do Lambda, consulte [Preços do Lambda](https://aws.amazon.com/lambda/pricing/). Você pode gerenciar a carga em sua função do Lambda ajustando os parâmetros `refreshAfterInSeconds` e `disconnectAfterInSeconds` na resposta da função do Lambda. Para obter mais informações sobre o conteúdo da resposta da função do Lambda, consulte [Definição de sua função do Lambda](custom-auth-lambda.md).

**nota**  
Se você deixar a assinatura ativada, poderá evitar o acionamento excessivo do seu Lambda por clientes não reconhecidos. Considere isso antes de desativar o login no seu autorizador.

**nota**  
O limite de tempo da função do Lambda para o autorizador personalizado é de 5 segundos.

# Criação e gerenciamento de autorizadores personalizados (CLI)
<a name="config-custom-auth"></a>

AWS IoT Core implementa esquemas personalizados de autenticação e autorização usando autorizadores personalizados. Um autorizador personalizado é um AWS IoT Core recurso que oferece a flexibilidade de definir e implementar as regras e políticas com base em seus requisitos específicos. Para criar um autorizador personalizado com step-by-step instruções, consulte [Tutorial: Criando um autorizador personalizado](https://docs.aws.amazon.com//iot/latest/developerguide/custom-auth-tutorial.html) para. AWS IoT Core

Cada autorizador consiste nos seguintes componentes: 
+  *Nome*: uma string exclusiva definida pelo usuário que identifica o autorizador.
+  *ARN da função do Lambda*: o nome do recurso da Amazon (ARN) da função do Lambda que implementa a lógica de autorização e autenticação.  
+  *Nome da chave do token*: o nome da chave usado para extrair o token dos cabeçalhos HTTP, dos parâmetros de consulta ou do nome de usuário do MQTT CONNECT para realizar a validação da assinatura. Esse valor será necessário se a assinatura estiver ativada em seu autorizador. 
+  *Sinalizador de assinatura desativada (opcional)*: um valor booleano que especifica se a exigência de assinatura nas credenciais deve ser desativada. Isso é útil para cenários em que assinar as credenciais não faz sentido, como esquemas de autenticação que usam nome de usuário e senha do MQTT. O valor padrão é `false`; portanto, a assinatura é ativada por padrão. 
+  *Chave pública de assinatura de token*: a chave pública que o AWS IoT Core usa para validar a assinatura de token. Seu comprimento mínimo é de 2.048 bits. Esse valor será necessário se a assinatura estiver ativada em seu autorizador.  

O Lambda cobra pelo número de vezes que sua função do Lambda é executada e pelo tempo necessário para que o código em sua função seja executado. Para obter mais informações sobre preços do Lambda, consulte [Preços do Lambda](https://aws.amazon.com/lambda/pricing/). Para obter mais informações sobre a criação de funções do Lambda, consulte o [Guia do desenvolvedor do Lambda](https://docs.aws.amazon.com/lambda/latest/dg/).

**nota**  
Se você deixar a assinatura ativada, poderá evitar o acionamento excessivo do seu Lambda por clientes não reconhecidos. Considere isso antes de desativar o login no seu autorizador.

**nota**  
O limite de tempo da função do Lambda para o autorizador personalizado é de 5 segundos.

**Topics**
+ [Definição de sua função do Lambda](custom-auth-lambda.md)
+ [Criar um autorizador de capacidade](custom-auth-create-authorizer.md)
+ [Autorizando AWS IoT a invocação da função Lambda](custom-auth-authorize.md)
+ [Testar seus autorizadores](custom-auth-testing.md)
+ [Gerenciar autorizadores personalizados](custom-auth-manage.md)

# Definição de sua função do Lambda
<a name="custom-auth-lambda"></a>

 Quando AWS IoT Core invoca seu autorizador, ele aciona o Lambda associado ao autorizador com um evento que contém o seguinte objeto JSON. O objeto JSON de exemplo contém todos os campos possíveis. Quaisquer campos que não sejam relevantes para a solicitação de conexão não estão incluídos.

```
{
    "token" :"aToken",
    "signatureVerified": Boolean, // Indicates whether the device gateway has validated the signature.
    "protocols": ["tls", "http", "mqtt"], // Indicates which protocols to expect for the request.
    "protocolData": {
        "tls" : {
            "serverName": "serverName" // The server name indication (SNI) host_name string.
        },
        "http": {
            "headers": {
                "#{name}": "#{value}"
            },
            "queryString": "?#{name}=#{value}"
        },
        "mqtt": {
            "username": "myUserName",
            "password": "myPassword", // A base64-encoded string.
            "clientId": "myClientId" // Included in the event only when the device sends the value.
        }
    },
    "connectionMetadata": {
        "id": UUID // The connection ID. You can use this for logging.
    },
}
```

 A função do Lambda deve usar essas informações para autenticar a conexão de entrada e decidir quais ações são permitidas na conexão. A função deve enviar uma resposta que contenha os seguintes valores. 
+  `isAuthenticated`: um valor booliano que indica se a solicitação foi autenticada.
+  `principalId`: uma sequência alfanumérica que atua como um identificador para o token enviado pela solicitação de autorização personalizada. O valor deve ser uma sequência alfanumérica com pelo menos um e não mais que 128 caracteres e corresponder a este padrão de expressão regular (regex): `([a-zA-Z0-9]){1,128}`. Caracteres especiais que não sejam alfanuméricos não são permitidos para uso com a `principalId` entrada AWS IoT Core. Consulte a documentação de outros AWS serviços se caracteres especiais não alfanuméricos forem permitidos para o. `principalId`
+  `policyDocuments`: uma lista de documentos de AWS IoT Core políticas formatados em JSON Para obter mais informações sobre a criação AWS IoT Core de políticas, consulte. [AWS IoT Core políticas](iot-policies.md) O número máximo de documentos de política é de 10 documentos de política. Cada documento de política pode ter, no máximo, 2.048 caracteres.
+  `disconnectAfterInSeconds`: um número inteiro que especifica a duração máxima (em segundos) da conexão com o gateway do AWS IoT Core . O valor mínimo é de 300 segundos e o valor máximo é de 86.400 segundos. O valor padrão é 86.400.
**nota**  
O valor de `disconnectAfterInSeconds` (retornado pela função do Lambda) é definido quando a conexão é estabelecida. Esse valor não poderá ser modificado durante as invocações do Lambda subsequentes para atualização da política.
+  `refreshAfterInSeconds`: um número inteiro que especifica o intervalo entre as atualizações da política. Quando esse intervalo passa, o AWS IoT Core invoca a função do Lambda para permitir atualizações de políticas. O valor mínimo é de 300 segundos e o valor máximo é de 86.400 segundos. 

  O objeto JSON a seguir contém um exemplo de resposta que sua função do Lambda pode enviar. 

 **\$1 "isAuthenticated":true, //A Boolean that determines whether client can connect. "principalId": "xxxxxxxx",  //A string that identifies the connection in logs. "disconnectAfterInSeconds": 86400,  "refreshAfterInSeconds": 300,   "policyDocuments": [       \$1         "Version": "2012-10-17",         "Statement": [            \$1               "Action": "iot:Publish",               "Effect": "Allow",               "Resource": "arn:aws:iot:us-east-1:<your\$1aws\$1account\$1id>:topic/customauthtesting"             \$1          ]        \$1     ] \$1**

 O `policyDocument` valor deve conter um documento AWS IoT Core de política válido. Para obter mais informações sobre AWS IoT Core políticas, consulte[AWS IoT Core políticas](iot-policies.md). Em MQTT sobre TLS e MQTT sobre WebSockets conexões, armazena em AWS IoT Core cache essa política para o intervalo especificado no valor do campo. `refreshAfterInSeconds` No caso de conexões HTTP, a função do Lambda é chamada para cada solicitação de autorização, a menos que seu dispositivo esteja usando conexões HTTP persistentes (também chamadas de keep-alive do HTTP ou reutilização de conexão HTTP). Você pode optar por ativar o armazenamento em cache ao configurar o autorizador. Durante esse intervalo, AWS IoT Core autoriza ações em uma conexão estabelecida com essa política em cache sem acionar sua função Lambda novamente. Se ocorrerem falhas durante a autenticação personalizada, a conexão AWS IoT Core será encerrada. AWS IoT Core também encerra a conexão se ela estiver aberta por mais tempo do que o valor especificado no `disconnectAfterInSeconds` parâmetro. 

 A seguir JavaScript está uma amostra da função Lambda do Node.js que procura uma senha na mensagem do MQTT Connect com um valor `test` de e retorna uma política que concede permissão AWS IoT Core para se conectar com um cliente `myClientName` chamado e publicar em um tópico que contém o mesmo nome de cliente. Se a senha esperada não for encontrada, ele retornará uma política que nega essas duas ações. 

```
// A simple Lambda function for an authorizer. It demonstrates 
// how to parse an MQTT password and generate a response.

exports.handler = function(event, context, callback) { 
    var uname = event.protocolData.mqtt.username;
    var pwd = event.protocolData.mqtt.password;
    var buff = new Buffer(pwd, 'base64');
    var passwd = buff.toString('ascii');
    switch (passwd) { 
        case 'test': 
            callback(null, generateAuthResponse(passwd, 'Allow')); 
            break;
        default: 
            callback(null, generateAuthResponse(passwd, 'Deny'));  
    }
};

// Helper function to generate the authorization response.
var generateAuthResponse = function(token, effect) { 
    var authResponse = {}; 
    authResponse.isAuthenticated = true; 
    authResponse.principalId = 'TEST123'; 
    
    var policyDocument = {}; 
    policyDocument.Version = '2012-10-17';		 	 	 
    policyDocument.Statement = []; 
    var publishStatement = {}; 
    var connectStatement = {};
    connectStatement.Action = ["iot:Connect"];
    connectStatement.Effect = effect;
    connectStatement.Resource = ["arn:aws:iot:us-east-1:123456789012:client/myClientName"];
    publishStatement.Action = ["iot:Publish"]; 
    publishStatement.Effect = effect; 
    publishStatement.Resource = ["arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName"]; 
    policyDocument.Statement[0] = connectStatement;
    policyDocument.Statement[1] = publishStatement; 
    authResponse.policyDocuments = [policyDocument]; 
    authResponse.disconnectAfterInSeconds = 3600; 
    authResponse.refreshAfterInSeconds = 300;
    
    return authResponse; 
}
```

 A função do Lambda anterior retorna o seguinte JSON ao receber a senha esperada de `test` na mensagem do MQTT Connect. Os valores das propriedades `password` e `principalId` serão os valores da mensagem do MQTT Connect.

```
{
  "password": "password",
  "isAuthenticated": true,
  "principalId": "principalId",
  "policyDocuments": [
    {
      "Version": "2012-10-17",		 	 	 
      "Statement": [
        {
          "Action": "iot:Connect",
          "Effect": "Allow",
          "Resource": "*"
        },
        {
          "Action": "iot:Publish",
          "Effect": "Allow",
          "Resource": "arn:aws:iot:region:accountId:topic/telemetry/${iot:ClientId}"
        },
        {
          "Action": "iot:Subscribe",
          "Effect": "Allow",
          "Resource": "arn:aws:iot:region:accountId:topicfilter/telemetry/${iot:ClientId}"
        },
        {
          "Action": "iot:Receive",
          "Effect": "Allow",
          "Resource": "arn:aws:iot:region:accountId:topic/telemetry/${iot:ClientId}"
        }
      ]
    }
  ],
  "disconnectAfterInSeconds": 3600,
  "refreshAfterInSeconds": 300
}
```

# Criar um autorizador de capacidade
<a name="custom-auth-create-authorizer"></a>

 Você pode criar um autorizador usando a [CreateAuthorizerAPI](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateAuthorizer.html). O exemplo a seguir descreve o comando. 

```
aws iot create-authorizer
--authorizer-name MyAuthorizer
--authorizer-function-arn arn:aws:lambda:us-west-2:<account_id>:function:MyAuthorizerFunction  //The ARN of the Lambda function.
[--token-key-name MyAuthorizerToken //The key used to extract the token from headers.
[--token-signing-public-keys FirstKey=
 "-----BEGIN PUBLIC KEY-----
  [...insert your public key here...] 
  -----END PUBLIC KEY-----"
[--status ACTIVE]
[--tags <value>]
[--signing-disabled | --no-signing-disabled]
```

Você pode usar o parâmetro `signing-disabled` para cancelar a validação da assinatura para cada invocação do seu autorizador. É altamente recomendável que você não desative a assinatura, a menos que necessário. A validação de assinatura protege você contra invocações excessivas de sua função do Lambda de dispositivos desconhecidos. Não é possível atualizar o status `signing-disabled` de um autorizador depois de criá-lo. Para alterar esse comportamento, é necessário criar outro autorizador personalizado com um valor diferente para o parâmetro `signing-disabled`. 

Os valores dos parâmetros `tokenKeyName` e `tokenSigningPublicKeys` serão opcionais se você tiver desativado a assinatura. Eles são valores obrigatórios se a assinatura estiver ativada. 

Depois de criar sua função Lambda e o autorizador personalizado, você deve conceder explicitamente ao AWS IoT Core serviço permissão para invocar a função em seu nome. Você pode fazer isso com o comando a seguir. 

**nota**  
O endpoint de IoT padrão pode não aceitar o uso de autorizadores personalizados com funções do Lambda. Em vez disso, você pode usar configurações de domínio para definir um novo endpoint e depois especificar esse endpoint para o autorizador personalizado.

```
aws lambda add-permission --function-name <lambda_function_name>
--principal iot.amazonaws.com --source-arn <authorizer_arn>
--statement-id Id-123 --action "lambda:InvokeFunction"
```

# Autorizando AWS IoT a invocação da função Lambda
<a name="custom-auth-authorize"></a>

Nesta seção, você concederá permissão ao recurso de autorizador personalizado que acabou de criar para executar a função do Lambda. Para conceder a permissão, você pode usar o comando da CLI [add-permission](https://docs.aws.amazon.com//cli/latest/reference/lambda/add-permission.html).

**Conceda permissão para sua função Lambda usando o AWS CLI**

1. Depois de inserir os valores, digite o seguinte comando. Observe que o valor `statement-id` deve ser exclusivo. Substitua `Id-1234` pelo valor exato que você tem, caso contrário, você poderá receber um erro de `ResourceConflictException`.

   ```
   aws lambda add-permission  \
   --function-name "custom-auth-function" \
   --principal "iot.amazonaws.com" \
   --action "lambda:InvokeFunction" \
   --statement-id "Id-1234" \
   --source-arn authorizerArn
   ```

1. Se o comando for executado com êxito, ele retornará uma declaração de permissão, como neste exemplo. Você pode continuar na próxima seção para testar o autorizador personalizado.

   ```
   {
       "Statement": "{\"Sid\":\"Id-1234\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"iot.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:Region:57EXAMPLE833:function:custom-auth-function\",\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:lambda:Region:57EXAMPLE833:function:custom-auth-function\"}}}"
   }
   ```

   Se o comando não for executado com êxito, ele retornará um erro, como neste exemplo. Será necessário verificar e corrigir o erro antes de continuar.

   ```
   An error occurred (AccessDeniedException) when calling the AddPermission operation: User: arn:aws:iam::57EXAMPLE833:user/EXAMPLE-1 is not authorized to perform: lambda:AddPer
   mission on resource: arn:aws:lambda:Region:57EXAMPLE833:function:custom-auth-function
   ```

# Testar seus autorizadores
<a name="custom-auth-testing"></a>

 Você pode usar a [TestInvokeAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_TestInvokeAuthorizer.html)API para testar a invocação e os valores de retorno do seu autorizador. Essa API permite que você especifique metadados de protocolo e teste a validação da assinatura em seu autorizador.

As guias a seguir mostram como usar o AWS CLI para testar seu autorizador.

------
#### [ Unix-like ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER \
--token TOKEN_VALUE --token-signature TOKEN_SIGNATURE
```

------
#### [ Windows CMD ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER ^
--token TOKEN_VALUE --token-signature TOKEN_SIGNATURE
```

------
#### [ Windows PowerShell ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER `
--token TOKEN_VALUE --token-signature TOKEN_SIGNATURE
```

------

O valor do parâmetro `token-signature` é o token assinado. Para saber como obter esse valor, consulte [Assinatura do token](custom-auth.md#custom-auth-token-signature).

Se seu autorizador usar um nome de usuário e uma senha, você poderá transmitir essas informações usando o parâmetro `--mqtt-context`. As guias a seguir mostram como usar a API `TestInvokeAuthorizer` para enviar um objeto JSON que contém nome de usuário, senha e nome de cliente para o autorizador personalizado.

------
#### [ Unix-like ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER  \
--mqtt-context '{"username": "USER_NAME", "password": "dGVzdA==", "clientId":"CLIENT_NAME"}'
```

------
#### [ Windows CMD ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER  ^
--mqtt-context '{"username": "USER_NAME", "password": "dGVzdA==", "clientId":"CLIENT_NAME"}'
```

------
#### [ Windows PowerShell ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER  `
--mqtt-context '{"username": "USER_NAME", "password": "dGVzdA==", "clientId":"CLIENT_NAME"}'
```

------

A senha deve ser codificada por base64. O exemplo a seguir mostra como codificar uma senha em um ambiente semelhante ao Unix.

```
echo -n PASSWORD | base64
```

# Gerenciar autorizadores personalizados
<a name="custom-auth-manage"></a>

 Você pode gerenciar seus autorizadores usando o seguinte APIs. 
+ [ListAuthorizers](https://docs.aws.amazon.com/iot/latest/apireference/API_ListAuthorizers.html): mostre todos os autorizadores em sua conta.
+  [DescribeAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeAuthorizer.html): exibe as propriedades do autorizador especificado. Esses valores incluem data de criação, data da última modificação e outros atributos.
+ [SetDefaultAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_SetDefaultAuthorizer.html): especifica o autorizador padrão para seus endpoints de AWS IoT Core dados. AWS IoT Core usa esse autorizador se um dispositivo não passar AWS IoT Core credenciais e não especificar um autorizador. Para obter mais informações sobre o uso de AWS IoT Core credenciais, consulte[Autenticação de cliente](client-authentication.md).
+ [UpdateAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_UpdateAuthorizer.html): altera o status, o nome da chave do token ou as chaves públicas do autorizador especificado.
+  [DeleteAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_DeleteAuthorizer.html): exclui o autorizador especificado. 

**nota**  
 Não é possível atualizar o requisito de assinatura de um autorizador. Assim, você não pode desativar a assinatura em um autorizador existente que exija isso. Você também não pode exigir a assinatura em um autorizador existente que não exija isso. 

# Autenticação personalizada com certificados de cliente X.509
<a name="custom-auth-509cert"></a>

Ao conectar dispositivos a AWS IoT Core, você tem vários [tipos de autenticação](protocols.md#connection-protocol-auth-mode) disponíveis. Você pode usar [certificados de cliente X.509](https://docs.aws.amazon.com//iot/latest/developerguide/x509-client-certs.html) que podem ser usados para autenticar conexões de clientes e dispositivos ou definir [autorizadores personalizados](https://docs.aws.amazon.com//iot/latest/developerguide/custom-authentication.html) para gerenciar sua própria lógica de autenticação e autorização de clientes. Este tópico aborda como usar a autenticação personalizada com certificados de cliente X.509.

Usar a autenticação personalizada com certificados X.509 pode ser útil se você já autenticou seus dispositivos usando certificados X.509 e quer realizar validação adicional e autorização personalizada. Por exemplo, se você armazenar os dados de seus dispositivos, como seus números de série, no certificado do cliente X.509, depois de AWS IoT Core autenticar o certificado do cliente X.509, poderá usar um autorizador personalizado para identificar dispositivos específicos com base nas informações armazenadas no campo do certificado. CommonName O uso da autenticação personalizada com certificados X.509 pode aprimorar o gerenciamento da segurança do dispositivo ao conectar dispositivos AWS IoT Core e fornecer mais flexibilidade para gerenciar a lógica de autenticação e autorização. AWS IoT Core [suporta autenticação personalizada com certificados X.509 usando o certificado X.509 e o tipo de autenticação de autorizador personalizado, que funciona com o protocolo [MQTT e o protocolo HTTPS](https://docs.aws.amazon.com//iot/latest/developerguide/mqtt.html).](https://docs.aws.amazon.com//iot/latest/developerguide/http.html) Para obter mais informações sobre os tipos de autenticação e os protocolos de aplicativos compatíveis com os endpoints do dispositivo do AWS IoT Core , consulte [Protocolos de comunicação do dispositivo](https://docs.aws.amazon.com//iot/latest/developerguide/protocols.html).

**nota**  
A autenticação personalizada com certificados de cliente X.509 não é suportada nas AWS GovCloud (US) regiões.

**Importante**  
Você deve usar um endpoint criado usando [configurações de domínio](iot-custom-endpoints-configurable.md). Além disso, os clientes devem fornecer a extensão de [Indicação de Nome do Servidor (SNI)](https://www.rfc-editor.org/rfc/rfc3546#section-3.1) ao se conectarem a. AWS IoT Core

**Topics**
+ [Etapa 1: registre seus certificados de cliente X.509 com AWS IoT Core](#custom-auth-509cert-client)
+ [Etapa 2: Criar uma função do Lambda](#custom-auth-509cert-lambda)
+ [Etapa 3: criar um autorizador personalizado](#custom-auth-509cert-authorizer)
+ [Etapa 4: definir o tipo de autenticação e o protocolo de aplicativo em uma configuração de domínio](#custom-auth-509cert-domainconfig)

## Etapa 1: registre seus certificados de cliente X.509 com AWS IoT Core
<a name="custom-auth-509cert-client"></a>

Se você ainda não fez isso, registre e ative seus [certificados de cliente X.509](https://docs.aws.amazon.com//iot/latest/developerguide/x509-client-certs.html) com. AWS IoT Core Caso contrário, vá para a próxima etapa.

Para registrar e ativar seus certificados de cliente com AWS IoT Core, siga as etapas:

1. Se você [criar certificados de cliente diretamente com AWS IoT](https://docs.aws.amazon.com//iot/latest/developerguide/device-certs-create.html). Esses certificados de cliente serão registrados automaticamente com AWS IoT Core.

1. Se você [criar seus próprios certificados de cliente](https://docs.aws.amazon.com//iot/latest/developerguide/device-certs-your-own.html), siga [estas instruções para registrá-los AWS IoT Core](https://docs.aws.amazon.com//iot/latest/developerguide/register-device-cert.html).

1. Para ativar seus certificados de cliente, siga [estas instruções](https://docs.aws.amazon.com//iot/latest/developerguide/activate-or-deactivate-device-cert.html).

## Etapa 2: Criar uma função do Lambda
<a name="custom-auth-509cert-lambda"></a>

AWS IoT Core usa autorizadores personalizados para implementar esquemas personalizados de autenticação e autorização. Um autorizador personalizado está associado a uma função do Lambda que determina se um dispositivo está autenticado e quais operações o dispositivo tem permissão para realizar. Quando um dispositivo se conecta AWS IoT Core, AWS IoT Core recupera os detalhes do autorizador, incluindo o nome do autorizador e a função Lambda associada, e invoca a função Lambda. A função do Lambda recebe um evento que contém um objeto JSON com os dados do certificado do cliente X.509 do dispositivo. Sua função do Lambda usa esse objeto JSON do evento para avaliar a solicitação de autenticação, decidir as ações a serem tomadas e enviar uma resposta de volta.

### Exemplo de evento da função do Lambda
<a name="custom-auth-509cert-event"></a>

O objeto JSON de exemplo a seguir contém todos os campos possíveis que podem ser incluídos. O objeto JSON real conterá apenas campos relevantes para a solicitação de conexão específica.

```
{
	"token": "aToken",
	"signatureVerified": true,
	"protocols": [
		"tls",
		"mqtt"
	],
	"protocolData": {
		"tls": {
			"serverName": "serverName",
			"x509CertificatePem": "x509CertificatePem",
			"principalId": "principalId"
		},
		"mqtt": {
			"clientId": "myClientId",
                     "username": "myUserName",
                     "password": "myPassword"
		}
	},
	"connectionMetadata": {
		"id": "UUID"
	}
}
```

`signatureVerified`  
Um valor booliano que indica se a assinatura do token configurada no autorizador foi verificada ou não antes de invocar a função do Lambda do autorizador. Se o autorizador estiver configurado para desativar a assinatura do token, esse campo será falso. 

`protocols`  
Uma matriz que contém os protocolos esperados da solicitação.

`protocolData`  
Um objeto que contém informações dos protocolos usados na conexão. Ele dá detalhes específicos do protocolo que podem ser úteis para autenticação, autorização e muito mais.  
`tls`: este objeto contém informações relacionadas ao protocolo TLS (Transport Layer Security).   
+ `serverName`: a string de nome de host [Indicação de nome de servidor (SNI)](https://www.rfc-editor.org/rfc/rfc3546#section-3.1). O AWS IoT Core requer que os dispositivos enviem a [extensão SNI](https://www.rfc-editor.org/rfc/rfc3546#section-3.1) para o protocolo Transport Layer Security (TLS) e forneçam o endereço completo do endpoint no campo `host_name`.
+ `x509CertificatePem`: o certificado X.509 no formato PEM, usado para autenticação do cliente na conexão TLS.
+ `principalId`: o identificador da entidade principal associado ao cliente na conexão TLS.
`mqtt`: esse objeto contém informações relacionadas ao protocolo MQTT.  
+ `clientId`: uma string só precisa ser incluída no caso de o dispositivo enviar esse valor.
+ `username`: o nome de usuário fornecido no pacote MQTT Connect.
+ `password`: a senha fornecida no pacote MQTT Connect.

`connectionMetadata`  
Metadados da conexão.  
`id`: o ID da conexão, que você pode usar para registrar em log e solucionar problemas.

**nota**  
Neste objeto JSON do evento, `x509CertificatePem` e `principalId` são dois novos campos na solicitação. O valor de `principalId` é igual ao valor de `certificateId`. Para obter mais informações, consulte [Certificado](https://docs.aws.amazon.com//iot/latest/apireference/API_Certificate.html).

### Exemplo de resposta da função do Lambda
<a name="custom-auth-509cert-response"></a>

A função do Lambda deve usar informações do objeto JSON do evento para autenticar a conexão de entrada e decidir quais ações são permitidas na conexão.

O objeto JSON a seguir contém um exemplo de resposta que sua função do Lambda pode enviar.

```
{
	"isAuthenticated": true,
	"principalId": "xxxxxxxx",
	"disconnectAfterInSeconds": 86400,
	"refreshAfterInSeconds": 300,
	"policyDocuments": [
		{
			"Version": "2012-10-17",		 	 	 
			"Statement": [
				{
					"Effect": "Allow",
					"Action": "iot:Publish",
					"Resource": "arn:aws:iot:us-east-1:123456789012:topic/customauthtesting"
				}
			]
		}
	]
}
```

Neste exemplo, essa função deve enviar uma resposta que contenha os valores a seguir.

`isAuthenticated`  
Um valor booliano que indica se a solicitação foi autenticada.

`principalId`  
Uma sequência alfanumérica que atua como um identificador para o token enviado pela solicitação de autorização personalizada. O valor deve ser uma sequência alfanumérica com pelo menos um e não mais que 128 caracteres. Ele identifica a conexão nos logs. O valor de `principalId` deve ser igual ao valor de `principalId` no objeto JSON do evento (ou seja, certificateID do certificado X.509).

`policyDocuments`  
Uma lista de documentos de políticas formatados em JSON AWS IoT Core . O valor é opcional e dá suporte a [variáveis de política de objeto](https://docs.aws.amazon.com//iot/latest/developerguide/thing-policy-variables.html) e [variáveis de política de certificado](https://docs.aws.amazon.com//iot/latest/developerguide/cert-policy-variables.html). O número máximo de documentos de política é de 10. Cada documento de política pode ter, no máximo, 2.048 caracteres. Se você tiver várias políticas anexadas ao certificado de cliente e à função do Lambda, a permissão é uma coleção de todas as políticas. Para obter mais informações sobre a criação de AWS IoT Core políticas, consulte [Políticas](https://docs.aws.amazon.com//iot/latest/developerguide/iot-policies.html).

`disconnectAfterInSeconds`  
Um número inteiro que especifica a duração máxima (em segundos) da conexão com o AWS IoT Core gateway. O valor mínimo é de 300 segundos e o valor máximo é de 86.400 segundos. `disconnectAfterInSeconds` é válido durante a vida útil de uma conexão e não é atualizado em atualizações consecutivas de políticas.

`refreshAfterInSeconds`  
Um número inteiro que especifica o intervalo entre as atualizações da política. Quando esse intervalo passa, AWS IoT Core invoca a função Lambda para permitir atualizações de políticas. O valor mínimo é de 300 segundos e o valor máximo é de 86.400 segundos.

### Exemplo de função do Lambda
<a name="custom-auth-509cert-js-example"></a>

A seguir está um exemplo de uma função do Lambda do Node.js. A função examina o certificado X.509 do cliente e extrai informações relevantes, como o número de série, a impressão digital e o nome do assunto. Se as informações extraídas corresponderem aos valores esperados, o cliente terá acesso para se conectar. Esse mecanismo garante que apenas clientes autorizados com certificados válidos possam estabelecer uma conexão.

```
const crypto = require('crypto');

exports.handler = async (event) => {
    
    // Extract the certificate PEM from the event
    const certPem = event.protocolData.tls.x509CertificatePem;
    
    // Parse the certificate using Node's crypto module
    const cert = new crypto.X509Certificate(certPem);
    
    var effect = "Deny";
    // Allow permissions only for a particular certificate serial, fingerprint, and subject
    if (cert.serialNumber === "7F8D2E4B9C1A5036DE8F7C4B2A91E5D80463BC9A1257" // This is a random serial
       && cert.fingerprint === "F2:9A:C4:1D:B5:E7:08:3F:6B:D0:4E:92:A7:C1:5B:8D:16:0F:E3:7A" // This is a random fingerprint
       && cert.subject === "allow.example.com") {
      effect = "Allow";
    }
    
    return generateAuthResponse(event.protocolData.tls.principalId, effect);
};


// Helper function to generate the authorization response.
function generateAuthResponse(principalId, effect) {
    const authResponse = {
        isAuthenticated: true,
        principalId,
        disconnectAfterInSeconds: 3600,
        refreshAfterInSeconds: 300,
        policyDocuments: [
          {
            Version: "2012-10-17",		 	 	 
            Statement: [
              {
                Action: ["iot:Connect"],
                Effect: effect,
                Resource: [
                  "arn:aws:iot:us-east-1:123456789012:client/myClientName"
                ]
              },
              {
                Action: ["iot:Publish"],
                Effect: effect,
                Resource: [
                  "arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName"
                ]
              },
              {
                Action: ["iot:Subscribe"],
                Effect: effect,
                Resource: [
                   "arn:aws:iot:us-east-1:123456789012:topicfilter/telemetry/myClientName"
                ]
              },
              {
                Action: ["iot:Receive"],
                Effect: effect,
                Resource: [
                   "arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName"
                ]
              }
            ]
          }
        ]
      };

  return authResponse;
}
```

A função do Lambda anterior retorna o JSON a seguir ao receber um certificado com o número de série, a impressão digital e o assunto esperados. O valor de `x509CertificatePem` será o certificado do cliente fornecido no handshake TLS. Para obter mais informações, consulte [Definir sua função do Lambda](https://docs.aws.amazon.com//iot/latest/developerguide/config-custom-auth.html#custom-auth-lambda).

```
{
	"isAuthenticated": true,
	"principalId": "principalId in the event JSON object",
	"policyDocuments": [
		{
			"Version": "2012-10-17",		 	 	 
			"Statement": [
				{
					"Action": "iot:Connect",
					"Effect": "Allow",
					"Resource": "arn:aws:iot:us-east-1:123456789012:client/myClientName"
				},
				{
					"Action": "iot:Publish",
					"Effect": "Allow",
					"Resource": "arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName"
				},
				{
					"Action": "iot:Subscribe",
					"Effect": "Allow",
					"Resource": "arn:aws:iot:us-east-1:123456789012:topicfilter/telemetry/myClientName"
				},
				{
					"Action": "iot:Receive",
					"Effect": "Allow",
					"Resource": "arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName"
				}
			]
		}
	],
	"disconnectAfterInSeconds": 3600,
	"refreshAfterInSeconds": 300
}
```

## Etapa 3: criar um autorizador personalizado
<a name="custom-auth-509cert-authorizer"></a>

Depois de você [definir a função do Lambda](#custom-auth-509cert-lambda), crie um autorizador personalizado para gerenciar sua própria lógica de autenticação e autorização do cliente. É possível seguir as instruções detalhadas na [Etapa 3: criar um recurso de autorizador de cliente e sua autorização](https://docs.aws.amazon.com//iot/latest/developerguide/custom-auth-tutorial.html#custom-auth-tutorial-authorizer). Para obter mais informações, consulte [Criar um autorizador](https://docs.aws.amazon.com//iot/latest/developerguide/config-custom-auth.html). 

No processo de criação do autorizador personalizado, você deve conceder a permissão do AWS IoT para invocar a função do Lambda após sua criação. Para obter instruções detalhadas, consulte [Autorização AWS IoT para invocar sua função Lambda](custom-auth-authorize.md).

## Etapa 4: definir o tipo de autenticação e o protocolo de aplicativo em uma configuração de domínio
<a name="custom-auth-509cert-domainconfig"></a>

Para autenticar dispositivos usando autenticação personalizada com certificados de cliente X.509, você deve definir o tipo de autenticação e o protocolo de aplicativo em uma configuração de domínio e enviar a extensão SNI. O valor de `authenticationType` deve ser `CUSTOM_AUTH_X509` e o valor de `applicationProtocol` pode ser `SECURE_MQTT` ou `HTTPS`.

### Definir o tipo de autenticação e o protocolo de aplicativo em uma configuração de domínio (CLI)
<a name="custom-auth-509cert-cli"></a>

Se você não tiver uma configuração de domínio, use o comando [https://docs.aws.amazon.com//cli/latest/reference/iot/create-domain-configuration.html](https://docs.aws.amazon.com//cli/latest/reference/iot/create-domain-configuration.html) para criar uma. O valor de `authenticationType` deve ser `CUSTOM_AUTH_X509` e o valor de `applicationProtocol` pode ser `SECURE_MQTT` ou `HTTPS`.

```
aws iot create-domain-configuration \
    --domain-configuration-name domainConfigurationName \
    --authentication-type CUSTOM_AUTH_X509 \  
    --application-protocol SECURE_MQTT \ 
    --authorizer-config '{
        "defaultAuthorizerName": my-custom-authorizer
    }'
```

Se você já tiver uma configuração de domínio, use o comando [https://docs.aws.amazon.com//cli/latest/reference/iot/update-domain-configuration.html](https://docs.aws.amazon.com//cli/latest/reference/iot/update-domain-configuration.html) e atualize `authenticationType` e `applicationProtocol`, se necessário. Observe que não é possível alterar o tipo de autenticação ou o protocolo no endpoint padrão (`iot:Data-ATS`).

```
aws iot update-domain-configuration \
    --domain-configuration-name domainConfigurationName \
    --authentication-type CUSTOM_AUTH_X509 \  
    --application-protocol SECURE_MQTT \
    --authorizer-config '{
        "defaultAuthorizerName": my-custom-authorizer
    }'
```

`domain-configuration-name`  
O nome da configuração do domínio.

`authentication-type`  
O tipo de autenticação da configuração do domínio. Para obter mais informações, consulte [Escolher um tipo de autenticação](protocols.md#connection-protocol-auth-mode).

`application-protocol`  
O protocolo de aplicativo que os dispositivos usam para se comunicar com o AWS IoT Core. Para obter mais informações, consulte [Escolhendo um protocolo de aplicativo](protocols.md#protocol-selection).

`--authorizer-config`  
Um objeto que especifica a configuração do autorizador em uma configuração de domínio.

`defaultAuthorizerName`  
O nome do autorizador para uma configuração de domínio.

Para obter mais informações, consulte [CreateDomainConfiguration](https://docs.aws.amazon.com//iot/latest/apireference/API_CreateDomainConfiguration.html)e a [UpdateDomainConfiguration](https://docs.aws.amazon.com//iot/latest/apireference/API_UpdateDomainConfiguration.html)partir da *Referência AWS IoT da API*. Para obter mais informações sobre configuração de domínio, consulte [Configurações de domínio](https://docs.aws.amazon.com//iot/latest/developerguide/iot-custom-endpoints-configurable.html).

# AWS IoT Core Conectando-se usando autenticação personalizada
<a name="custom-auth"></a>

 Os dispositivos podem se conectar AWS IoT Core usando autenticação personalizada com qualquer protocolo AWS IoT Core compatível com mensagens de dispositivos. Para obter mais informações sobre protocolos de comunicação disponíveis, consulte [Protocolos de comunicação do dispositivo](protocols.md).  Os dados de conexão transmitidos para a função do Lambda do autorizador dependem do protocolo usado. Para obter mais informações sobre como a função do Lambda do autorizador, consulte [Definição de sua função do Lambda](custom-auth-lambda.md). As seções a seguir explicam como se conectar para autenticar usando cada protocolo compatível.

## HTTPS
<a name="custom-auth-http"></a>

Dispositivos que enviam dados AWS IoT Core usando a [API HTTP Publish](https://docs.aws.amazon.com/iot/latest/apireference/API_iotdata_Publish.html) podem passar credenciais por meio de cabeçalhos de solicitação ou parâmetros de consulta em suas solicitações HTTP POST. Os dispositivos podem especificar um autorizador a ser invocado usando o cabeçalho `x-amz-customauthorizer-name` ou o parâmetro de consulta. Se você tiver a assinatura de token ativada no autorizador, será necessário transmitir `token-key-name` e `x-amz-customauthorizer-signature` nos cabeçalhos da solicitação ou nos parâmetros de consulta. Observe que o `token-signature` valor deve ser codificado em URL ao ser usado JavaScript de dentro do navegador.

**nota**  
O autorizador do cliente para o protocolo HTTPS é compatível somente com operações de publicação. Para obter mais informações sobre o protocolo HTTP, consulte [Protocolos de comunicação do dispositivo](protocols.md).

Os exemplos de solicitações a seguir mostram como transmitir esses parâmetros nos cabeçalhos de solicitação e nos parâmetros de consulta. 

```
//Passing credentials via headers
POST /topics/topic?qos=qos HTTP/1.1
Host: your-endpoint 
x-amz-customauthorizer-signature: token-signature
token-key-name: token-value 
x-amz-customauthorizer-name: authorizer-name

//Passing credentials via query parameters
POST /topics/topic?qos=qos&x-amz-customauthorizer-signature=token-signature&token-key-name=token-value HTTP/1.1
```

## MQTT
<a name="custom-auth-mqtt"></a>

 Os dispositivos que se conectam AWS IoT Core usando uma conexão MQTT podem passar credenciais pelos `password` campos `username` e das mensagens MQTT. Opcionalmente, o valor `username` também pode conter uma string de consulta que transmite valores adicionais (incluindo token, assinatura e nome do autorizador) ao autorizador. Você poderá usar essa string de consulta caso queira usar um esquema de autenticação baseado em tokens em vez de valores `username` e `password`.  

**nota**  
 Os dados no campo de senha são codificados em base64 por. AWS IoT Core A sua função do Lambda deve decodificá-los. 

 O exemplo a seguir contém uma string `username` com parâmetros extras que especificam um token e uma assinatura.  

```
username?x-amz-customauthorizer-name=authorizer-name&x-amz-customauthorizer-signature=token-signature&token-key-name=token-value
```

Para invocar um autorizador, os dispositivos que se conectam AWS IoT Core usando o MQTT e a autenticação personalizada devem se conectar na porta 443. Eles também devem passar a extensão TLS de negociação de protocolo de camada de aplicativo (ALPN) com um valor de `mqtt` e a extensão de indicação de nome de servidor (SNI) com o nome do host de seu endpoint de dados. AWS IoT Core Para evitar possíveis erros, o valor de `x-amz-customauthorizer-signature` deve ser codificado em URL. Também é altamente recomendável que os valores de `x-amz-customauthorizer-name` e `token-key-name` sejam codificados em URL. Para obter mais informações sobre esses valores, consulte [Protocolos de comunicação do dispositivo](protocols.md). O [AWS IoT Device SDKs, Mobile SDKs e AWS IoT Device Client](iot-sdks.md) V2 pode configurar essas duas extensões. 

## Acabou o MQTT WebSockets
<a name="custom-auth-websockets"></a>

 Os dispositivos que se conectam AWS IoT Core usando o MQTT over WebSockets podem transmitir credenciais de uma das duas maneiras a seguir. 
+ Por meio de cabeçalhos de solicitação ou parâmetros de consulta na solicitação HTTP UPGRADE para estabelecer a WebSockets conexão.
+ Através dos campos `username` e `password` na mensagem do MQTT CONNECT.

 Se você transmitir as credenciais pela mensagem de conexão do MQTT, as extensões TLS ALPN e SNI serão necessárias. Para obter mais informações sobre essas extensões, consulte [MQTT](#custom-auth-mqtt). O exemplo a seguir demonstra como transmitir credenciais por meio da solicitação HTTP Upgrade. 

```
GET /mqtt HTTP/1.1
Host: your-endpoint 
Upgrade: WebSocket 
Connection: Upgrade 
x-amz-customauthorizer-signature: token-signature
token-key-name: token-value 
sec-WebSocket-Key: any random base64 value 
sec-websocket-protocol: mqtt 
sec-WebSocket-Version: websocket version
```

## Assinatura do token
<a name="custom-auth-token-signature"></a>

É necessário assinar o token com a chave privada do par de chaves públicas/privadas usadas na chamada `create-authorizer`. Os exemplos a seguir mostram como criar a assinatura do token usando um comando semelhante ao Unix e. JavaScript Eles usam o algoritmo de hash SHA-256 para codificar a assinatura.

------
#### [ Command line ]

```
echo -n TOKEN_VALUE | openssl dgst -sha256 -sign PEM encoded RSA private key | openssl base64
```

------
#### [ JavaScript ]

```
const crypto = require('crypto')

const key = "PEM encoded RSA private key"

const k = crypto.createPrivateKey(key)
let sign = crypto.createSign('SHA256')
sign.write(t)
sign.end()
const s = sign.sign(k, 'base64')
```

------

# Solução de problemas dos autorizadores
<a name="custom-auth-troubleshooting"></a>

 Este tópico aborda problemas comuns que podem causar problemas em fluxos de trabalho de autenticação personalizada e as etapas para resolvê-los. Para solucionar problemas com mais eficiência, habilite CloudWatch os registros AWS IoT Core e defina o nível do registro como **DEBUG**. Você pode ativar CloudWatch os registros no AWS IoT Core console ([https://console.aws.amazon.com/iot/](https://console.aws.amazon.com/iot/)). Para obter mais informações sobre como habilitar e configurar logs do AWS IoT Core, consulte [Configurar o AWS IoT registro](configure-logging.md). 

**nota**  
Se você deixar o nível de registro em **DEBUG** por longos períodos de tempo, CloudWatch poderá armazenar grandes quantidades de dados de registro. Isso pode aumentar suas CloudWatch cobranças. Considere usar o registro baseado em recursos para aumentar a verbosidade somente para dispositivos em um determinado grupo de objetos. Para obter mais informações sobre o registro baseado em recursos, consulte [Configurar o AWS IoT registro](configure-logging.md). Além disso, ao concluir a solução de problemas, reduza o nível do log para um nível menos detalhado.

Antes de iniciar a solução de problemas, analise [Entender o fluxo de trabalho de autenticação personalizada](custom-authorizer.md) para obter uma visão geral do processo de autenticação personalizada. Isso ajuda você a entender onde procurar a origem de um problema.

Este tópico discute as duas áreas a seguir para você investigar.
+ Problemas relacionados à função do Lambda do autorizador.
+ Problemas relacionados ao dispositivo.

## Verifique se há problemas na função do Lambda do autorizador
<a name="custom-auth-troubleshooting-lambda"></a>

Execute as etapas a seguir para garantir que as tentativas de conexão de seus dispositivos estejam invocando a função do Lambda.

1. Verifique qual função do Lambda está associada ao seu autorizador.

   Você pode fazer isso chamando a [DescribeAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeAuthorizer.html)API ou clicando no autorizador desejado na seção **Seguro** do AWS IoT Core console.

1. Verifique as métricas de invocação da função do Lambda. Para fazer isso, execute as seguintes etapas.

   1. Abra o AWS Lambda console ([https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)) e selecione a função associada ao seu autorizador.

   1. Escolha a guia **Monitorar** e visualize as métricas do período relevante para o seu problema.

1. Se você não ver nenhuma invocação, verifique se AWS IoT Core tem permissão para invocar sua função Lambda. Se você vir invocações, pule para a próxima etapa. Execute as etapas a seguir para verificar se sua função do Lambda tem as permissões necessárias.

   1. Escolha a guia **Permissões** para sua função no AWS Lambda console.

   1. Localize a seção **Política baseada em recursos** na parte inferior da página. Se a função do Lambda tiver as permissões necessárias, a política será semelhante ao exemplo a seguir.  
****  

      ```
      {
        "Version":"2012-10-17",		 	 	 
        "Id": "default",
        "Statement": [
          {
            "Sid": "Id123",
            "Effect": "Allow",
            "Principal": {
              "Service": "iot.amazonaws.com"
            },
            "Action": "lambda:InvokeFunction",
            "Resource": "arn:aws:lambda:us-east-1:111111111111:function:FunctionName",
            "Condition": {
              "ArnLike": {
                "AWS:SourceArn": "arn:aws:iot:us-east-1:111111111111:authorizer/AuthorizerName"
              },
              "StringEquals": {
                "AWS:SourceAccount": "111111111111"
              }
            }
          }
        ]
      }
      ```

   1. Esta política concede a `InvokeFunction` permissão de sua função ao AWS IoT Core diretor. Se você não a vê, precisará adicioná-la usando a [AddPermission](https://docs.aws.amazon.com/lambda/latest/dg/API_AddPermission.html)API. O exemplo a seguir mostra como fazer isso utilizando a AWS CLI.

      ```
      aws lambda add-permission --function-name FunctionName --principal iot.amazonaws.com --source-arn AuthorizerARn --statement-id Id-123 --action "lambda:InvokeFunction"
      ```

1. Se você vir invocações, verifique se não há erros. Um erro pode indicar que a função Lambda não está manipulando adequadamente o evento de conexão que é AWS IoT Core enviado para ela.

   Para ver informações sobre como lidar com o evento na função do Lambda, consulte [Definição de sua função do Lambda](custom-auth-lambda.md). Você pode usar o recurso de teste no AWS Lambda console ([https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)) para codificar os valores de teste na função para garantir que a função esteja manipulando os eventos corretamente.

1. Se você vir invocações sem erros, mas os dispositivos não conseguirem se conectar (ou publicar, assinar e receber mensagens), talvez a política retornada pela função do Lambda não conceda permissões para as ações que os dispositivos estão tentando realizar. Execute as etapas a seguir para determinar se há algo errado com a política retornada pela função.

   1. Use uma consulta do Amazon CloudWatch Logs Insights para escanear registros por um curto período de tempo para verificar se há falhas. A consulta de exemplo a seguir classifica os eventos por data e hora e procura falhas.

      ```
      display clientId, eventType, status, @timestamp | sort @timestamp desc | filter status = "Failure"    
      ```

   1. Atualize sua função Lambda para registrar os dados aos quais ela está retornando AWS IoT Core e o evento que aciona a função. Você pode usar esses registros para inspecionar a política criada pela função.

1. Se você vir invocações sem erros, mas os dispositivos não conseguirem se conectar (ou publicar, assinar e receber mensagens), outra possível causa é que a função do Lambda excede o limite de tempo. O limite de tempo da função do Lambda para o autorizador personalizado é de 5 segundos. Você pode verificar a duração da função em CloudWatch registros ou métricas. 

## Investigar problemas do dispositivo
<a name="custom-auth-troubleshooting-investigate"></a>

Se você não encontrar problemas ao invocar a função do Lambda ou com a política que a função retorna, procure problemas com as tentativas de conexão dos dispositivos. Solicitações de conexão malformadas podem fazer com que seu autorizador AWS IoT Core não seja acionado. Problemas de conexão podem ocorrer tanto na camada TLS quanto na camada do aplicativo.

**Possíveis problemas na camada TLS:**
+ Os clientes devem passar um cabeçalho de nome de host (HTTP, MQTT over WebSockets) ou a extensão TLS de indicação de nome de servidor (HTTP, MQTT over WebSockets, MQTT) em todas as solicitações de autenticação personalizadas. Em ambos os casos, o valor passado deve corresponder a um dos endpoints de AWS IoT Core dados da sua conta. Esses são os endpoints que são retornados ao executar os seguintes comandos da CLI.
  + `aws iot describe-endpoint --endpoint-type iot:Data-ATS`
  + `aws iot describe-endpoint --endpoint-type iot:Data`(para VeriSign endpoints antigos)
+ Os dispositivos que usam autenticação personalizada para conexões MQTT também devem transmitir a extensão TLS Application Layer Protocol Negotiation (ALPN) com um valor de `mqtt`.
+ No momento, a autenticação personalizada está disponível somente na porta 443.

**Possíveis problemas na camada de aplicativo:**
+ Se a assinatura estiver ativada (o campo `signingDisabled` é falso em seu autorizador), procure os seguintes problemas de assinatura.
  + Certifique-se de transmitir a assinatura do token no cabeçalho `x-amz-customauthorizer-signature` ou em um parâmetro de string de consulta.
  + Certifique-se de que o serviço não esteja assinando um valor diferente do token.
  + Certifique-se de transmitir o token no cabeçalho ou no parâmetro de consulta que você especificou no campo `token-key-name` do autorizador.
+ Verifique se o nome do autorizador transmitido no cabeçalho `x-amz-customauthorizer-name` ou no parâmetro do string de consulta é válido ou se você tem um autorizador padrão definido para sua conta.