Conectarse a AWS IoT Core mediante autenticación personalizada - AWS IoT Core

Conectarse a AWS IoT Core mediante autenticación personalizada

Los dispositivos se pueden conectar a AWS IoT Core mediante una autenticación personalizada con cualquier protocolo compatible con AWS IoT Core de mensajería de dispositivos. Para obtener más información acerca de los protocolos de comunicación compatibles, consulte Protocolos de comunicación de dispositivos.  Los datos de conexión que se transfieren a la función de Lambda de su autorizador dependen del protocolo que utilice. Para obtener más información acerca de cómo crear la función de Lambda de su autorizador, consulte Definición de la función de Lambda. En las secciones siguientes se explica cómo conectarse para autenticarse mediante cada protocolo compatible.

HTTPS

Los dispositivos que envían datos a AWS IoT Core mediante la API de publicación HTTP pueden pasar las credenciales a través de los encabezados de las solicitudes o de los parámetros de consulta en sus solicitudes HTTP POST. Los dispositivos pueden especificar un autorizador para invocarlo mediante el encabezado x-amz-customauthorizer-name o el parámetro de consulta. Si tiene habilitada la firma por token en su autorizador, debe pasar token-key-name y x-amz-customauthorizer-signature en los encabezados de las solicitudes o en los parámetros de consulta. Tenga en cuenta que el valor de token-signature debe estar codificado como URL cuando utilice JavaScript desde el navegador.

nota

El autorizador del cliente para el protocolo HTTPS solo admite operaciones de publicación. Para obtener más información acerca del protocolo HTTP, consulte Protocolos de comunicación de dispositivos.

Los siguientes ejemplos de solicitudes muestran cómo se transfieren estos parámetros tanto en los encabezados de las solicitudes como en los 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

Los dispositivos que se conectan a AWS IoT Core mediante una conexión MQTT pueden pasar las credenciales a través de los campos username y password de los mensajes MQTT. De forma opcional, el valor de username también puede contener una cadena de consulta que transfiere valores adicionales (como un token, una firma y el nombre del autorizador) a su autorizador. Puede utilizar esta cadena de consulta si desea utilizar un esquema de autenticación basado en símbolos en lugar de valores username y password

nota

Los datos del campo de contraseña están codificados en base64 por AWS IoT Core. Debe descodificarlos con la función de Lambda.

El siguiente ejemplo contiene una cadena username con parámetros adicionales que especifican un token y una firma. 

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

Para invocar un autorizador, los dispositivos que se conecten a AWS IoT Core mediante MQTT y la autenticación personalizada deben conectarse al puerto 443. También deben pasar la extensión TLS de negociación de protocolo de capa de aplicación (ALPN) con un valor de mqtt y la extensión de Indicación del nombre del servidor (SNI) con el nombre de host de su punto de conexión de datos de AWS IoT Core. Para evitar posibles errores, el valor de x-amz-customauthorizer-signature debe estar codificado como URL. También recomendamos encarecidamente que los valores de x-amz-customauthorizer-name y token-key-name estén codificados como URL. Para obtener más información acerca de estos valores, consulteProtocolos de comunicación de dispositivos. V2 SDK de dispositivos, SDK para móviles y cliente de dispositivo de AWS IoT puede configurar estas dos extensiones. 

MQTT a través de WebSockets

Los dispositivos que se conectan a AWS IoT Core mediante MQTT a través de WebSockets pueden transferir las credenciales de una de las dos maneras siguientes.

  • Mediante encabezados de solicitud o parámetros de consulta en la solicitud HTTP UPGRADE para establecer la conexión WebSockets.

  • A través de los campos username y password del mensaje MQTT CONNECT.

Si pasa las credenciales a través del mensaje de conexión de MQTT, se requieren las extensiones TLS ALPN y SNI. Para obtener más información, consulte MQTT. El siguiente ejemplo ilustra cómo pasar credenciales a través de la solicitud de actualización de HTTP.

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

Firmar el token

Debe firmar el token con la clave privada del par de claves pública-privada que utilizó en la llamada a create-authorizer. Los siguientes ejemplos muestran cómo crear la firma del token mediante un comando similar a Unix y JavaScript. Utilizan el algoritmo hash SHA-256 para codificar la firma.

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