

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

# Tutorial: Criando um autorizador personalizado para AWS IoT Core
<a name="custom-auth-tutorial"></a>

Este tutorial demonstra as etapas para criar, validar e usar a autenticação personalizada usando a AWS CLI. Opcionalmente, usando este tutorial, você pode usar o Postman para enviar dados ao AWS IoT Core usando a API de publicação HTTP.

Este tutorial mostra como criar um exemplo de função do Lambda que implementa a lógica de autorização e autenticação e um autorizador personalizado usando a chamada **create-authorizer** com a assinatura de token ativada. O autorizador é então validado usando o. E**test-invoke-authorizer**, finalmente, você pode enviar dados AWS IoT Core usando a API HTTP Publish para um tópico de teste do MQTT. A solicitação de amostra especificará o autorizador a ser invocado usando o `x-amz-customauthorizer-name` cabeçalho e transmitirá os cabeçalhos token-key-name e `x-amz-customauthorizer-signature` na solicitação.

**O que você aprenderá neste tutorial:**
+ Como criar uma função do Lambda para ser um manipulador de autorizador personalizado
+ Como criar um autorizador personalizado usando o AWS CLI com a assinatura de token ativada
+ Como testar seu autorizador personalizado usando o comando **test-invoke-authorizer**
+ Como publicar um tópico do MQTT usando o [Postman](https://www.postman.com/) e validar a solicitação com seu autorizador personalizado

Este tutorial leva cerca de 60 minutos para ser concluído.

**Topics**
+ [Etapa 1: criar uma função do Lambda para seu autorizador personalizado](#custom-auth-tutorial-define)
+ [Etapa 2: criar um par de chaves pública e privada do autorizador privado](#custom-auth-tutorial-keys)
+ [Etapa 3: Criar um recurso de autorizador personalizado e sua autorização](#custom-auth-tutorial-authorizer)
+ [Etapa 4: testar o autorizador ligando test-invoke-authorizer](#custom-auth-tutorial-test)
+ [Etapa 5: testar a publicação da mensagem MQTT usando o Postman](#custom-auth-tutorial-postman)
+ [Etapa 6: visualizar mensagens no cliente de teste MQTT](#custom-auth-tutorial-testclient)
+ [Etapa 7: revisar os resultados e as próximas etapas](#custom-auth-tutorial-review)
+ [Etapa 8: Limpeza](#custom-auth-tutorial-cleanup)

**Antes de começar este tutorial, verifique se você tem o seguinte:**
+ 

**[Configurar Conta da AWS](setting-up.md)**  
Você precisará do seu AWS IoT console Conta da AWS e do console para concluir este tutorial. 

  A conta que você usa para este tutorial funciona melhor quando inclui pelo menos as seguintes políticas gerenciadas da AWS :
  + [https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/IAMFullAccess$jsonEditor](https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/IAMFullAccess$jsonEditor)
  + [https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSIoTFullAccess$jsonEditor](https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSIoTFullAccess$jsonEditor)
  + [https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSLambda_FullAccess$jsonEditor](https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSLambda_FullAccess$jsonEditor)
**Importante**  
As políticas do IAM usadas neste tutorial são mais permissivas do que você deveria seguir em uma implementação de produção. Em um ambiente de produção, certifique-se de que as políticas de sua conta e recursos concedam somente as permissões necessárias.  
Ao criar políticas do IAM para produção, determine qual acesso os usuários e perfis precisam e, em seguida, crie políticas que permitam que eles executem apenas essas tarefas.  
Para obter mais informações, consulte [Práticas recomendadas de segurança no IAM](https://docs.aws.amazon.com//IAM/latest/UserGuide/best-practices.html).
+ 

**Instalou o AWS CLI**  
Para obter informações sobre como instalar o AWS CLI, consulte [Instalando a AWS CLI](https://docs.aws.amazon.com//cli/latest/userguide/cli-chap-install.html). Este tutorial requer uma AWS CLI versão `aws-cli/2.1.3 Python/3.7.4 Darwin/18.7.0 exe/x86_64` ou posterior.
+ 

**Ferramentas do OpenSSL**  
Os exemplos neste tutorial usam o [LibreSSL 2.6.5](https://www.libressl.org/). Você também pode usar as ferramentas [OpenSSL v1.1.1i](https://www.openssl.org/) para este tutorial.
+ 

**Revisou a visão geral do [AWS Lambda](https://docs.aws.amazon.com//lambda/latest/dg/welcome.html)**  
Se você nunca usou AWS Lambda antes, revise [AWS Lambda](https://docs.aws.amazon.com//lambda/latest/dg/welcome.html)e [Comece a usar o Lambda](https://docs.aws.amazon.com//lambda/latest/dg/getting-started.html) para aprender seus termos e conceitos.
+ 

**Consultar como criar solicitações no Postman**  
Para obter mais informações, consulte [Solicitações de criação](https://learning.postman.com/docs/sending-requests/requests/).
+ 

**Remover autorizadores personalizados do tutorial anterior**  
Você só Conta da AWS pode ter um número limitado de autorizadores personalizados configurados ao mesmo tempo. Para ver informações sobre como remover um autorizador personalizado, consulte [Etapa 8: Limpeza](#custom-auth-tutorial-cleanup).

## Etapa 1: criar uma função do Lambda para seu autorizador personalizado
<a name="custom-auth-tutorial-define"></a>

A autenticação personalizada AWS IoT Core usa [recursos do autorizador](https://docs.aws.amazon.com//iot/latest/apireference/API_AuthorizerDescription.html) que você cria para autenticar e autorizar clientes. A função que você criará nesta seção autentica e autoriza os clientes à medida que eles se conectam AWS IoT Core e AWS IoT acessam os recursos.

A função do Lambda faz o seguinte:
+ Se uma solicitação vier do **test-invoke-authorizer**, ela retornará uma política do IAM com uma ação `Deny`.
+ Se uma solicitação vier do Postman usando HTTP e o parâmetro `actionToken` tiver um valor de `allow`, ela retornará uma política do IAM com uma ação `Allow`. Caso contrário, ele retornará uma política do IAM com uma ação `Deny`.

**Para criar uma função do Lambda para seu autorizador personalizado**

1. No console do [Lambda](https://console.aws.amazon.com//lambda/home#), abra [Funções](https://console.aws.amazon.com//lambda/home#/functions).

1. Escolha a opção **Criar função**.

1. Confirme se **Criar do zero** está selecionado.

1. Em **Basic information**:

   1. Em **Nome do perfil**, insira **custom-auth-function**.

   1. Em **Runtime**, confirme **Node.js 18.x** 

1. Escolha a opção **Criar função**.

   O Lambda cria uma função Node.js e uma [função de execução](https://docs.aws.amazon.com//lambda/latest/dg/lambda-intro-execution-role.html) que concede à função permissão para fazer upload de logs. A função Lambda assume a função de execução quando você invoca sua função e usa a função de execução para criar credenciais para o AWS SDK e ler dados de fontes de eventos.

1. Para ver o código e a configuração da função no [AWS Cloud9](https://docs.aws.amazon.com/cloud9/latest/user-guide/welcome.html)editor, escolha **custom-auth-function**na janela do designer e escolha **index.js** no painel de navegação do editor.

   Para linguagens de script, como o Node.js, o Lambda inclui uma função básica que retorna uma resposta de sucesso. Você pode usar o editor do [AWS Cloud9](https://docs.aws.amazon.com/cloud9/latest/user-guide/welcome.html) para editar sua função, desde que seu código-fonte não exceda 3 MB.

1. Substitua o código **index.js** no editor pelo código a seguir:

   ```
   // A simple Lambda function for an authorizer. It demonstrates
   // How to parse a CLI and Http password to generate a response.
   
   export const handler = async (event, context, callback) => {
   
       //Http parameter to initiate allow/deny request
       const HTTP_PARAM_NAME='actionToken';
       const ALLOW_ACTION = 'Allow';
       const DENY_ACTION = 'Deny';
   
       //Event data passed to Lambda function
       var event_str = JSON.stringify(event);
       console.log('Complete event :'+ event_str);
   
       //Read protocolData from the event json passed to Lambda function
       var protocolData = event.protocolData;
       console.log('protocolData value---> ' + protocolData);
   
       //Get the dynamic account ID from function's ARN to be used
       // as full resource for IAM policy
       var ACCOUNT_ID = context.invokedFunctionArn.split(":")[4];
       console.log("ACCOUNT_ID---"+ACCOUNT_ID);
   
       //Get the dynamic region from function's ARN to be used
       // as full resource for IAM policy
       var REGION = context.invokedFunctionArn.split(":")[3];
       console.log("REGION---"+REGION);
   
       //protocolData data will be undefined if testing is done via CLI.
       // This will help to test the set up.
       if (protocolData === undefined) {
   
           //If CLI testing, pass deny action as this is for testing purpose only.
           console.log('Using the test-invoke-authorizer cli for testing only');
           callback(null, generateAuthResponse(DENY_ACTION,ACCOUNT_ID,REGION));
   
       } else{
   
           //Http Testing from Postman
           //Get the query string from the request
           var queryString = event.protocolData.http.queryString;
           console.log('queryString values -- ' + queryString);
           /*         global URLSearchParams       */
           const params = new URLSearchParams(queryString);
           var action = params.get(HTTP_PARAM_NAME);
   
           if(action!=null && action.toLowerCase() === 'allow'){
   
               callback(null, generateAuthResponse(ALLOW_ACTION,ACCOUNT_ID,REGION));
   
           }else{
   
               callback(null, generateAuthResponse(DENY_ACTION,ACCOUNT_ID,REGION));
   
           }
   
       }
   
   };
   
   // Helper function to generate the authorization IAM response.
   var generateAuthResponse = function(effect,ACCOUNT_ID,REGION) {
   
       var full_resource = "arn:aws:iot:"+ REGION + ":" + ACCOUNT_ID + ":*";
       console.log("full_resource---"+full_resource);
   
       var authResponse = {};
       authResponse.isAuthenticated = true;
       authResponse.principalId = 'principalId';
   
       var policyDocument = {};
       policyDocument.Version = '2012-10-17';		 	 	 
       policyDocument.Statement = [];
       var statement = {};
       statement.Action = 'iot:*';
       statement.Effect = effect;
       statement.Resource = full_resource;
       policyDocument.Statement[0] = statement;
       authResponse.policyDocuments = [policyDocument];
       authResponse.disconnectAfterInSeconds = 3600;
       authResponse.refreshAfterInSeconds = 600;
   
       console.log('custom auth policy function called from http');
       console.log('authResponse --> ' + JSON.stringify(authResponse));
       console.log(authResponse.policyDocuments[0]);
   
       return authResponse;
   }
   ```

1. Escolha **Implantar**.

1. Depois que **Alterações implantadas** aparecer acima do editor:

   1. Role até a seção **Visão geral da função** acima do editor.

   1. Copie o **ARN da função** e salve-o para usar posteriormente neste tutorial.

1. Teste a função do .

   1. Selecione a guia **Testar**.

   1. Usando as configurações de teste padrão, escolha **Invocar**.

   1. Se o teste for concluído com êxito, nos **Resultados da execução**, abra a visualização **Detalhes**. Você deve ver o documento de política que a função retornou.

      Se o teste falhou ou você não vê um documento de política, analise o código para encontrar e corrigir os erros.

## Etapa 2: criar um par de chaves pública e privada do autorizador privado
<a name="custom-auth-tutorial-keys"></a>

Seu autorizador personalizado requer uma chave pública e privada para autenticá-lo. Os comandos nesta seção usam ferramentas OpenSSL para criar esse par de chaves.

**Parar criar o par de chaves pública e privada do autorizador privado**

1. Crie o arquivo da chave privada.

   ```
   openssl genrsa -out private-key.pem 4096
   ```

1. Verifique o arquivo da chave privada criado.

   ```
   openssl rsa -check -in private-key.pem -noout
   ```

   Se o comando não exibir nenhum erro, o arquivo de chave privada é válido.

1. Crie o arquivo da chave pública.

   ```
   openssl rsa -in private-key.pem -pubout -out public-key.pem
   ```

1. Verifique o arquivo da chave pública.

   ```
   openssl pkey -inform PEM -pubin -in public-key.pem -noout
   ```

   Se o comando não exibir nenhum erro, o arquivo de chave pública é válido.

## Etapa 3: Criar um recurso de autorizador personalizado e sua autorização
<a name="custom-auth-tutorial-authorizer"></a>

O autorizador AWS IoT personalizado é o recurso que une todos os elementos criados nas etapas anteriores. Nesta seção, você criará um recurso de autorizador personalizado e concederá a ele permissão para executar a função do Lambda criada anteriormente. Você pode criar um recurso de autorização personalizado usando o AWS IoT console AWS CLI, o ou a AWS API. 

Para este tutorial, você só precisa criar um autorizador personalizado. Esta seção descreve como criar usando o AWS IoT console e o AWS CLI, para que você possa usar o método mais conveniente para você. Não há diferença entre os recursos de autorizador personalizado criados por nenhum dos métodos.

### Criar um recurso de autorizador personalizado
<a name="custom-auth-tutorial-authorizer-resource"></a>

**Escolha uma destas opções para criar seu recurso de autorizador personalizado**
+ [Crie um autorizador personalizado usando o console AWS IoT](#create-custom-auth-in-console)
+ [Criar um autorizador personalizado usando a AWS CLI](#create-custom-auth-in-cli)

**Para criar um autorizador personalizado (console)**

1. Abra a [página do autorizador personalizado do AWS IoT console](https://console.aws.amazon.com//iot/home#/authorizerhub) e escolha **Criar autorizador**.

1. Em **Criar autorizador**:

   1. Em **Nome do autorizador**, insira **my-new-authorizer**.

   1. Em **Status do autorizador**, marque **Ativo**.

   1. Em **Função do autorizador**, escolha a função do Lambda criada anteriormente.

   1. Em **Validação de token - opcional**:

      1. Ative a **Validação do token**.

      1. Em **Nome da chave do token**, insira **tokenKeyName**.

      1. Escolha **Adicionar chave**.

      1. Em **Nome da chave**, insira **FirstKey**.

      1. Em **Chave pública**, insira o conteúdo do arquivo `public-key.pem`. Certifique-se de incluir as linhas do arquivo com `-----BEGIN PUBLIC KEY-----` e `-----END PUBLIC KEY-----` e não adicionar ou remover nenhum avanço de linha, retornos de carro ou outros caracteres do conteúdo do arquivo. A string inserida deve ser semelhante a este exemplo.

         ```
         -----BEGIN PUBLIC KEY-----
         MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvEBzOk4vhN+3LgslvEWt
         sLCqNmt5Damas3bmiTRvq2gjRJ6KXGTGQChqArAJwL1a9dkS9+maaXC3vc6xzx9z
         QPu/vQOe5tyzz1MsKdmtFGxMqQ3qjEXAMPLEOmqyUKPP5mff58k6ePSfXAnzBH0q
         lg2HioefrpU5OSAnpuRAjYKofKjbc2Vrn6N2G7hV+IfTBvCElf0csalS/Rk4phD5
         oa4Y0GHISRnevypg5C8n9Rrz91PWGqP6M/q5DNJJXjMyleG92hQgu1N696bn5Dw8
         FhedszFa6b2x6xrItZFzewNQkPMLMFhNrQIIyvshtT/F1LVCS5+v8AQ8UGGDfZmv
         QeqAMAF7WgagDMXcfgKSVU8yid2sIm56qsCLMvD2Sq8Lgzpey9N5ON1o1Cvldwvc
         KrJJtgwW6hVqRGuShnownLpgG86M6neZ5sRMbVNZO8OzcobLngJ0Ibw9KkcUdklW
         gvZ6HEJqBY2XE70iEXAMPLETPHzhqvK6Ei1HGxpHsXx6BNft582J1VpgYjXha8oa
         /NN7l7Zbj/euAb41IVtmX8JrD9z613d1iM5L8HluJlUzn62Q+VeNV2tdA7MfPfMC
         8btGYladFAnitThaz6+F0VSBJPu7pZQoLnqyEp5zLMtF+kFl2yOBmGAP0RBivRd9
         JWBUCG0bqcLQPeQyjbXSOfUCAwEAAQ==
         -----END PUBLIC KEY-----
         ```

1. Selecione **Criar autorizador**.

1. Se o recurso do autorizador personalizado tiver sido criado, você verá a lista de autorizadores personalizados, onde deve aparecer o seu novo autorizador personalizado, e você poderá continuar na próxima seção para testá-lo.

   Se você vir um erro, analise-o, tente criar seu autorizador personalizado novamente e verifique as entradas. Observe que cada recurso de autorizador personalizado deve ter um nome exclusivo.

**Para criar um autorizador personalizado (AWS CLI)**

1. Substitua seus valores por `authorizer-function-arn` e `token-signing-public-keys` e, em seguida, execute o seguinte comando:

   ```
   aws iot create-authorizer \
   --authorizer-name "my-new-authorizer" \
   --token-key-name "tokenKeyName" \
   --status ACTIVE \
   --no-signing-disabled \
   --authorizer-function-arn "arn:aws:lambda:Region:57EXAMPLE833:function:custom-auth-function" \
   --token-signing-public-keys FirstKey="-----BEGIN PUBLIC KEY-----
   MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvEBzOk4vhN+3LgslvEWt
   sLCqNmt5Damas3bmiTRvq2gjRJ6KXGTGQChqArAJwL1a9dkS9+maaXC3vc6xzx9z
   QPu/vQOe5tyzz1MsKdmtFGxMqQ3qjEXAMPLEOmqyUKPP5mff58k6ePSfXAnzBH0q
   lg2HioefrpU5OSAnpuRAjYKofKjbc2Vrn6N2G7hV+IfTBvCElf0csalS/Rk4phD5
   oa4Y0GHISRnevypg5C8n9Rrz91PWGqP6M/q5DNJJXjMyleG92hQgu1N696bn5Dw8
   FhedszFa6b2x6xrItZFzewNQkPMLMFhNrQIIyvshtT/F1LVCS5+v8AQ8UGGDfZmv
   QeqAMAF7WgagDMXcfgKSVU8yid2sIm56qsCLMvD2Sq8Lgzpey9N5ON1o1Cvldwvc
   KrJJtgwW6hVqRGuShnownLpgG86M6neZ5sRMbVNZO8OzcobLngJ0Ibw9KkcUdklW
   gvZ6HEJqBY2XE70iEXAMPLETPHzhqvK6Ei1HGxpHsXx6BNft582J1VpgYjXha8oa
   /NN7l7Zbj/euAb41IVtmX8JrD9z613d1iM5L8HluJlUzn62Q+VeNV2tdA7MfPfMC
   8btGYladFAnitThaz6+F0VSBJPu7pZQoLnqyEp5zLMtF+kFl2yOBmGAP0RBivRd9
   JWBUCG0bqcLQPeQyjbXSOfUCAwEAAQ==
   -----END PUBLIC KEY-----"
   ```

**Em que:**
   + O valor `authorizer-function-arn` é o nome do recurso da Amazon (ARN) da função do Lambda que você criou para o seu autorizador personalizado.
   + O valor `token-signing-public-keys` inclui o nome da chave, **FirstKey** e o conteúdo do arquivo `public-key.pem`. Certifique-se de incluir as linhas do arquivo com `-----BEGIN PUBLIC KEY-----` e `-----END PUBLIC KEY-----` e não adicionar ou remover nenhum avanço de linha, retornos de carro ou outros caracteres do conteúdo do arquivo. 

     Nota: tome cuidado ao inserir a chave pública, pois qualquer alteração em seu valor a tornará inutilizável.

1. Se o autorizador personalizado for criado, o comando retornará o nome e o ARN do novo recurso, como o seguinte.

   ```
   {
       "authorizerName": "my-new-authorizer",
       "authorizerArn": "arn:aws:iot:Region:57EXAMPLE833:authorizer/my-new-authorizer"
   }
   ```

   Salve o valor `authorizerArn` para uso na próxima etapa.

   Lembre-se de que cada recurso de autorizador personalizado deve ter um nome exclusivo.

### Autorizar o recurso de autorizador personalizado
<a name="custom-auth-tutorial-authorizer-permission"></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` por outro valor se você já tiver executado esse tutorial antes ou se receber um erro `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
   ```

## Etapa 4: testar o autorizador ligando test-invoke-authorizer
<a name="custom-auth-tutorial-test"></a>

Com todos os recursos definidos, nesta seção, você ligará test-invoke-authorizer da linha de comando para testar o passe de autorização.

Observe que, ao invocar o autorizador a partir da linha de comando, `protocolData` não está definido; portanto, o autorizador sempre retornará um documento DENY. No entanto, esse teste confirma que seu autorizador personalizado e a função do Lambda estão configurados corretamente, mesmo que não teste totalmente a função do Lambda.

**Para testar seu autorizador personalizado e sua função Lambda usando o AWS CLI**

1. No diretório que contém o arquivo `private-key.pem` criado na etapa anterior, execute o seguinte comando.

   ```
   echo -n "tokenKeyValue" | openssl dgst -sha256 -sign private-key.pem | openssl base64 -A
   ```

   Esse comando cria uma string de assinatura para ser usada na próxima etapa. A string de assinatura é semelhante a esta:

   ```
   dBwykzlb+fo+JmSGdwoGr8dyC2qB/IyLefJJr+rbCvmu9Jl4KHAA9DG+V+MMWu09YSA86+64Y3Gt4tOykpZqn9mn
   VB1wyxp+0bDZh8hmqUAUH3fwi3fPjBvCa4cwNuLQNqBZzbCvsluv7i2IMjEg+CPY0zrWt1jr9BikgGPDxWkjaeeh
   bQHHTo357TegKs9pP30Uf4TrxypNmFswA5k7QIc01n4bIyRTm90OyZ94R4bdJsHNig1JePgnuOBvMGCEFE09jGjj
   szEHfgAUAQIWXiVGQj16BU1xKpTGSiTAwheLKUjITOEXAMPLECK3aHKYKY+d1vTvdthKtYHBq8MjhzJ0kggbt29V
   QJCb8RilN/P5+vcVniSXWPplyB5jkYs9UvG08REoy64AtizfUhvSul/r/F3VV8ITtQp3aXiUtcspACi6ca+tsDuX
   f3LzCwQQF/YSUy02u5XkWn+sto6KCkpNlkD0wU8gl3+kOzxrthnQ8gEajd5Iylx230iqcXo3osjPha7JDyWM5o+K
   EWckTe91I1mokDr5sJ4JXixvnJTVSx1li49IalW4en1DAkc1a0s2U2UNm236EXAMPLELotyh7h+flFeloZlAWQFH
   xRlXsPqiVKS1ZIUClaZWprh/orDJplpiWfBgBIOgokJIDGP9gwhXIIk7zWrGmWpMK9o=
   ```

   Copie essa string de assinatura para usá-la na próxima etapa. Tome cuidado para não incluir caracteres extras nem omitir nenhum.

1. Nesse comando, substitua o valor `token-signature` pela string de assinatura da etapa anterior e execute esse comando para testar seu autorizador.

   ```
   aws iot test-invoke-authorizer \
   --authorizer-name my-new-authorizer \
   --token tokenKeyValue \
   --token-signature dBwykzlb+fo+JmSGdwoGr8dyC2qB/IyLefJJr+rbCvmu9Jl4KHAA9DG+V+MMWu09YSA86+64Y3Gt4tOykpZqn9mnVB1wyxp+0bDZh8hmqUAUH3fwi3fPjBvCa4cwNuLQNqBZzbCvsluv7i2IMjEg+CPY0zrWt1jr9BikgGPDxWkjaeehbQHHTo357TegKs9pP30Uf4TrxypNmFswA5k7QIc01n4bIyRTm90OyZ94R4bdJsHNig1JePgnuOBvMGCEFE09jGjjszEHfgAUAQIWXiVGQj16BU1xKpTGSiTAwheLKUjITOEXAMPLECK3aHKYKY+d1vTvdthKtYHBq8MjhzJ0kggbt29VQJCb8RilN/P5+vcVniSXWPplyB5jkYs9UvG08REoy64AtizfUhvSul/r/F3VV8ITtQp3aXiUtcspACi6ca+tsDuXf3LzCwQQF/YSUy02u5XkWn+sto6KCkpNlkD0wU8gl3+kOzxrthnQ8gEajd5Iylx230iqcXo3osjPha7JDyWM5o+KEWckTe91I1mokDr5sJ4JXixvnJTVSx1li49IalW4en1DAkc1a0s2U2UNm236EXAMPLELotyh7h+flFeloZlAWQFHxRlXsPqiVKS1ZIUClaZWprh/orDJplpiWfBgBIOgokJIDGP9gwhXIIk7zWrGmWpMK9o=
   ```

   Se o comando for executado com êxito, ele retornará as informações geradas por sua função de autorizador personalizado, como neste exemplo.

   ```
   {
       "isAuthenticated": true,
       "principalId": "principalId",
       "policyDocuments": [
           "{\"Version\":\"2012-10-17\",		 	 	 \"Statement\":[{\"Action\":\"iot:*\",\"Effect\":\"Deny\",\"Resource\":\"arn:aws:iot:Region:57EXAMPLE833:*\"}]}"
       ],
       "refreshAfterInSeconds": 600,
       "disconnectAfterInSeconds": 3600
   }
   ```

   Se o comando retornar um erro, analise-o e verifique novamente os comandos usados nesta seção.

## Etapa 5: testar a publicação da mensagem MQTT usando o Postman
<a name="custom-auth-tutorial-postman"></a>

1. Para obter o endpoint de dados do dispositivo a partir da linha de comando, chame [describe-endpoint](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-endpoint.html) conforme mostrado aqui

   ```
   aws iot describe-endpoint --output text --endpoint-type iot:Data-ATS
   ```

   Salve esse endereço para uso como *device\$1data\$1endpoint\$1address* em uma etapa posterior.

1. Abra uma nova janela do Postman e crie uma nova solicitação HTTP POST.

   1. No seu computador, abra o aplicativo Postman.

   1. No Postman, no menu **Arquivo**, escolha **Novo…**.

   1. Na caixa de diálogo **Novo**, selecione **Solicitação**.

   1. Em Salvar solicitação,

      1. Em **Nome da solicitação**, insira **Custom authorizer test request**.

      1. Em **Selecionar uma coleção ou pasta para salvar:** escolha ou crie uma coleção na qual salvar essa solicitação.

      1. Escolha **Salvar em *collection\$1name***.

1. Crie a solicitação do POST para testar seu autorizador personalizado.

   1. No seletor do método de solicitação ao lado do campo URL, escolha **POST**. 

   1. No campo URL, crie o URL para sua solicitação usando o seguinte URL com o comando *device\$1data\$1endpoint\$1address* from the [describe-endpoint](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-endpoint.html) em uma etapa anterior.

      ```
      https://device_data_endpoint_address:443/topics/test/cust-auth/topic?qos=0&actionToken=allow
      ```

      Observe que esse URL inclui o parâmetro de consulta `actionToken=allow` que fará com que a função do Lambda retorne um documento de política que permita acesso à AWS IoT. Depois de inserir o URL, os parâmetros de consulta também serão exibidos na guia **Parâmetros** do Postman.

   1. Na guia **Autenticação**, no campo **Tipo**, escolha **Sem autenticação**.

   1. Na guia Cabeçalhos:

      1. Se houver uma chave de **host** marcada, desmarque-a.

      1. Na parte inferior da lista de cabeçalhos, adicione estes novos cabeçalhos e confirme se estão marcados. Substitua o **Host** valor pelo seu *device\$1data\$1endpoint\$1address* e o **x-amz-customauthorizer-signature** valor pela string de assinatura que você usou com o **test-invoke-authorize** comando na seção anterior.    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/iot/latest/developerguide/custom-auth-tutorial.html)

   1. Na guia Corpo:

      1. Na caixa de opção de formato de dados, escolha **Bruto**.

      1. Na lista de tipos de dados, escolha **JavaScript**.

      1. No campo de texto, insira esta carga de mensagem JSON para sua mensagem de teste:

         ```
         {
             "data_mode": "test",
             "vibration": 200,
             "temperature": 40
         }
         ```

1. Escolha **Enviar** para enviar a solicitação.

   Se a solicitação for concluída com êxito, ela retornará:

   ```
   {
       "message": "OK",
       "traceId": "ff35c33f-409a-ea90-b06f-fbEXAMPLE25c"
   }
   ```

   A resposta bem-sucedida indica que seu autorizador personalizado permitiu a conexão AWS IoT e que a mensagem de teste foi entregue ao broker in AWS IoT Core. 

   Se retornar um erro, revise a mensagem de erro*device\$1data\$1endpoint\$1address*, a string de assinatura e os outros valores do cabeçalho.

Mantenha essa solicitação no Postman para uso na próxima seção.

## Etapa 6: visualizar mensagens no cliente de teste MQTT
<a name="custom-auth-tutorial-testclient"></a>

Na etapa anterior, você enviou mensagens simuladas do dispositivo AWS IoT usando o Postman. A resposta bem-sucedida indicou que seu autorizador personalizado permitiu a conexão à AWS IoT e que a mensagem de teste foi entregue ao agente no AWS IoT Core. Nesta seção, você usará o cliente de teste MQTT no AWS IoT console para ver o conteúdo da mensagem da mesma forma que outros dispositivos e serviços.

**Para ver as mensagens de teste autorizadas pelo seu autorizador personalizado**

1. No AWS IoT console, abra o [cliente de teste MQTT](https://console.aws.amazon.com//iot/home#/test).

1. Na guia **Assinar um tópico**, em **Filtro de tópicos**, insira **test/cust-auth/topic**, que é o tópico da mensagem usado no exemplo do Postman da seção anterior.

1. Escolha **Assinar**.

   Mantenha essa janela visível para a próxima etapa.

1. No Postman, na solicitação criada na seção anterior, escolha **Enviar**.

   Analise a resposta para verificar se ela foi concluída com êxito. Caso contrário, solucione o erro conforme descrito na seção anterior.

1. No **cliente de teste do MQTT**, deve ser possível ver uma nova entrada que mostra o tópico da mensagem e, se expandida, a carga da mensagem da solicitação enviada pelo Postman.

   Se você não vir suas mensagens no **cliente de teste do MQTT**, aqui estão alguns itens que você deve verificar:
   + Certifique-se de que sua solicitação do Postman tenha sido retornada com êxito. Se AWS IoT rejeitar a conexão e retornar um erro, a mensagem na solicitação não será passada para o agente de mensagens.
   + Verifique se o Conta da AWS e Região da AWS usado para abrir o AWS IoT console é o mesmo que você está usando no URL do Postman.
   + Garanta que você esteja usando o endpoint adequado para o autorizador personalizado. 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 especificá-lo para o autorizador personalizado.
   + Verifique se você inseriu o tópico corretamente no **cliente de teste do MQTT**. O filtro do tópico diferencia letras maiúsculas de minúsculas. Em caso de dúvida, você também pode se inscrever no **\$1** tópico, que assina todas as mensagens MQTT que passam pelo agente de mensagens Conta da AWS e Região da AWS usadas para abrir o AWS IoT console.

## Etapa 7: revisar os resultados e as próximas etapas
<a name="custom-auth-tutorial-review"></a>

**Neste tutorial:**
+ Você criou uma função do Lambda para ser um manipulador de autorizador personalizado
+ Você criou um autorizador personalizado com a assinatura de token ativada
+ Você testou seu autorizador personalizado usando o comando **test-invoke-authorizer**
+ Você publicou um tópico do MQTT usando o [Postman](https://www.postman.com/) e validou a solicitação com seu autorizador personalizado
+ Você usou o **cliente de teste MQTT** para visualizar as mensagens enviadas do seu teste do Postman

**Próximas etapas**  
Depois de enviar algumas mensagens do Postman para verificar se o autorizador personalizado está funcionando, experimente analisar como a alteração de diferentes aspectos deste tutorial afeta os resultados. Aqui estão alguns exemplos para você começar.
+ Altere a string da assinatura para que não seja mais válido ver como as tentativas de conexão não autorizadas são processadas. Você deve receber uma resposta de erro, como essa, e a mensagem não deve aparecer no **cliente de teste do MQTT**. 

  ```
  {
      "message": "Forbidden",
      "traceId": "15969756-a4a4-917c-b47a-5433e25b1356"
  }
  ```
+ Para saber mais sobre como encontrar erros que possam ocorrer durante o desenvolvimento e o uso de AWS IoT regras, consulte[Monitoramento AWS IoT](monitoring_overview.md).

## Etapa 8: Limpeza
<a name="custom-auth-tutorial-cleanup"></a>

Se quiser repetir este tutorial, talvez seja necessário remover alguns dos autorizadores personalizados. Você Conta da AWS pode ter apenas um número limitado de autorizadores personalizados configurados ao mesmo tempo e você pode obter um `LimitExceededException` ao tentar adicionar um novo sem remover um autorizador personalizado existente.

**Para remover um autorizador personalizado (console)**

1. Abra a [página do autorizador personalizado do AWS IoT console](https://console.aws.amazon.com//iot/home#/authorizerhub) e, na lista de autorizadores personalizados, encontre o autorizador personalizado a ser removido.

1. Abra a página de detalhes do autorizador personalizado e, no menu **Ações**, escolha **Editar**.

1. Desmarque a opção **Ativar autorizador** e, em seguida, selecione **Atualizar**.

   Não é possível excluir um autorizador personalizado enquanto ele estiver ativo.

1. Na página de detalhes do autorizador personalizado, abra o menu **Ações** e selecione **Excluir**.

**Para remover um autorizador personalizado (AWS CLI)**

1. Liste os autorizadores personalizados que você instalou e localize o nome do autorizador personalizado que deseja excluir.

   ```
   aws iot list-authorizers 
   ```

1. Defina o autorizador personalizado como `inactive` executando esse comando após substituir `Custom_Auth_Name` pelo `authorizerName` do autorizador personalizado a ser excluído.

   ```
   aws iot update-authorizer --status INACTIVE --authorizer-name Custom_Auth_Name
   ```

1. Exclua o autorizador personalizado executando esse comando após substituir `Custom_Auth_Name` pelo `authorizerName` do autorizador personalizado a ser excluído.

   ```
   aws iot delete-authorizer --authorizer-name Custom_Auth_Name
   ```