Conectar-se ao AWS IoT Core usando autenticação personalizada - AWS IoT Core

Conectar-se ao AWS IoT Core usando autenticação personalizada

Os dispositivos podem se conectar ao AWS IoT Core usando a autenticação personalizada com qualquer protocolo compatível com o AWS IoT Core para mensagens de dispositivos. Para obter mais informações sobre protocolos de comunicação disponíveis, consulte Protocolos de comunicação do dispositivo.  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. As seções a seguir explicam como se conectar para autenticar usando cada protocolo compatível.

HTTPS

Dispositivos que enviam dados do AWS IoT Core usando a API HTTP Publish podem transmitir 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 valor token-signature deve ser codificado em URL ao usar JavaScript no 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.

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

Os dispositivos que se conectam ao AWS IoT Core usando uma conexão MQTT podem transmitir credenciais pelos campos username e password 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 do usuário devem ser codificados em base64 pelo 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 ao AWS IoT Core usando o MQTT e a autenticação personalizada devem se conectar na porta 443. Eles também devem transmitir a extensão TLS Application Layer Protocol Negotiation (ALPN) com um valor de mqtt e a extensão Server Name Indication (SNI) com o nome do host do endpoint de dados do 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. O AWS IoT Device SDKs, Mobile SDKs e AWS IoT Device Client V2 pode configurar essas duas extensões. 

MQTT por WebSockets

Dispositivos que se conectam ao AWS IoT Core usando MQTT por 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 conexão WebSockets.

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

É 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')