

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

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

 Os dispositivos podem se conectar AWS IoT Core usando a autenticação personalizada com qualquer protocolo que AWS IoT Core ofereça suporte para 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')
```

------