

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Creación y administración de autorizadores personalizados (CLI)
<a name="config-custom-auth"></a>

AWS IoT Core implementa esquemas de autenticación y autorización personalizados mediante autorizadores personalizados. Un autorizador personalizado es un AWS IoT Core recurso que le brinda la flexibilidad de definir e implementar las reglas y políticas en función de sus requisitos específicos. Para crear un autorizador personalizado con step-by-step instrucciones, consulte el [tutorial: Creación de un autorizador personalizado](https://docs.aws.amazon.com//iot/latest/developerguide/custom-auth-tutorial.html) para. AWS IoT Core

Cada autorizador está formado por los siguientes componentes: 
+  *Nombre*: cadena única definida por el usuario que identifica al autorizador.
+  *ARN de la función de Lambda*: el nombre de recurso de Amazon (ARN) de la función de Lambda que implementa la lógica de autorización y autenticación.  
+  *Nombre de la clave del token*: el nombre de la clave que se utiliza para extraer el token de los encabezados HTTP, los parámetros de consulta o el nombre de usuario de MQTT CONNECT con el fin de realizar la validación de la firma. Este valor es obligatorio si la firma está habilitada en el autorizador. 
+  *Indicador de deshabilitación de firma (opcional)*: valor booleano que especifica si se debe deshabilitar el requisito de firma en las credenciales. Esto resulta útil en situaciones en las que no tiene sentido firmar las credenciales, como los esquemas de autenticación que utilizan el nombre de usuario y la contraseña de MQTT. El valor predeterminado es `false`, por lo que la firma está habilitada de forma predeterminada. 
+  *Clave pública de firma del token*: la clave pública que AWS IoT Core utiliza para validar la firma del token. Su longitud mínima es de 2048 bits. Este valor es obligatorio si la firma está habilitada en el autorizador.  

Lambda cobra por el número de veces que se ejecuta la función de Lambda y por el tiempo que tarda en ejecutarse el código de la función. Para obtener más información acerca de los precios de Lambda, consulte [Precios de Lambda](https://aws.amazon.com/lambda/pricing/). Para obtener más información acerca de la creación de funciones de Lambda, consulte la [Guía para desarrolladores de Lambda](https://docs.aws.amazon.com/lambda/latest/dg/).

**nota**  
Si deja habilitada la firma, puede evitar que clientes no reconocidos activen su Lambda de forma excesiva. Tenga esto en cuenta antes de deshabilitar el inicio de sesión en su autorizador.

**nota**  
El límite de tiempo de espera de la función de Lambda para el autorizador personalizado es de 5 segundos.

**Topics**
+ [Definición de la función de Lambda](custom-auth-lambda.md)
+ [Creación de un autorizador](custom-auth-create-authorizer.md)
+ [Autorizar la invocación AWS IoT de la función Lambda](custom-auth-authorize.md)
+ [Probar los autorizadores](custom-auth-testing.md)
+ [Administración de puntos de conexión](custom-auth-manage.md)

# Definición de la función de Lambda
<a name="custom-auth-lambda"></a>

 Cuando AWS IoT Core invoca al autorizador, activa la Lambda asociada al autorizador con un evento que contiene el siguiente objeto JSON. El objeto JSON de ejemplo contiene todos los campos posibles. No se incluye ningún campo que no sea relevante para la solicitud de conexión.

```
{
    "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.
    },
}
```

 La función de Lambda debe usar esta información para autenticar la conexión entrante y decidir qué acciones se permiten en la conexión. La función debe enviar una respuesta que contenga los siguientes valores. 
+  `isAuthenticated`: un valor booleano que indica si la solicitud se ha autenticado.
+  `principalId`: una cadena alfanumérica que actúa como identificador del token enviado por la solicitud de autorización personalizada. El valor debe ser una cadena alfanumérica entre 1 y 128 caracteres, y debe coincidir con este patrón de expresión regular (regex): `([a-zA-Z0-9]){1,128}`. No se permite el uso de caracteres especiales que no sean alfanuméricos con el in. `principalId` AWS IoT Core Consulte la documentación de otros AWS servicios si se permiten caracteres especiales no alfanuméricos para el. `principalId`
+  `policyDocuments`: Una lista de documentos de políticas con formato JSON Para obtener más información sobre la creación de AWS IoT Core políticas, consulte. AWS IoT Core [AWS IoT Core políticas](iot-policies.md) El número máximo de documentos de políticas es de 10. Cada documento de política puede contener un máximo de 2048 caracteres.
+  `disconnectAfterInSeconds`: un entero que especifica la duración máxima (en segundos) de la conexión a la puerta de enlace de AWS IoT Core . El valor mínimo es de 300 segundos y el máximo es de 86 400 segundos. El valor predeterminado es 86 400.
**nota**  
El valor de `disconnectAfterInSeconds` (devuelto por la función de Lambda) se determina cuando se establece la conexión. Este valor no se puede modificar durante las siguientes invocaciones de Lambda de actualización de políticas.
+  `refreshAfterInSeconds`: un entero que especifica el intervalo entre las actualizaciones de la política. Cuando pasa este intervalo, AWS IoT Core invoca la función de Lambda para permitir la actualización de las políticas. El valor mínimo es de 300 segundos y el máximo es de 86 400 segundos. 

  El siguiente objeto JSON contiene un ejemplo de una respuesta que la función de Lambda puede 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**

 El `policyDocument` valor debe contener un documento de política válido AWS IoT Core . Para obtener más información sobre AWS IoT Core las políticas, consulte[AWS IoT Core políticas](iot-policies.md). En MQTT sobre TLS y MQTT sobre WebSockets conexiones, almacena en AWS IoT Core caché esta política durante el intervalo especificado en el valor del campo. `refreshAfterInSeconds` En el caso de las conexiones HTTP, se invoca la función de Lambda para cada solicitud de autorización, a menos que su dispositivo utilice conexiones HTTP persistentes (también denominadas HTTP keep-alive o reutilización de conexiones HTTP). Puede optar por habilitar el almacenamiento en caché al configurar el autorizador. Durante este intervalo, AWS IoT Core autoriza las acciones en una conexión establecida en contra de esta política en caché sin volver a activar la función Lambda. Si se producen errores durante la autenticación personalizada, AWS IoT Core finaliza la conexión. AWS IoT Core también termina la conexión si ha estado abierta durante más tiempo que el valor especificado en el `disconnectAfterInSeconds` parámetro. 

 A continuación, se JavaScript incluye un ejemplo de función Lambda de Node.js que busca una contraseña en el mensaje de MQTT Connect con un valor `test` de y devuelve una política que concede permiso AWS IoT Core para conectarse con un cliente `myClientName` denominado y publicar en un tema que contenga el mismo nombre de cliente. Si no encuentra la contraseña esperada, devuelve una política que deniega esas dos acciones. 

```
// 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; 
}
```

 La función de Lambda anterior devuelve el siguiente JSON cuando recibe la contraseña esperada de `test` en el mensaje MQTT Connect. Los valores de las propiedades `password` y `principalId` serán los valores del mensaje 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
}
```

# Creación de un autorizador
<a name="custom-auth-create-authorizer"></a>

 [Puede crear un autorizador mediante la API. CreateAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateAuthorizer.html) En el siguiente ejemplo, se describe el 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]
```

Puede utilizar el parámetro `signing-disabled` para deshabilitar la validación de firmas en cada invocación de su autorizador. Le recomendamos encarecidamente que no deshabilite la firma a menos que sea necesario. La validación de firmas lo protege contra las invocaciones excesivas de su función de Lambda desde dispositivos desconocidos. No se puede actualizar el estado `signing-disabled` de un autorizador una vez creado. Para cambiar este comportamiento, debe crear otro autorizador personalizado con un valor de parámetro `signing-disabled` diferente. 

Los valores de los parámetros `tokenKeyName` y `tokenSigningPublicKeys` son opcionales si se deshabilita la firma. Son valores obligatorios si la firma está habilitada. 

Tras crear la función Lambda y el autorizador personalizado, debe conceder explícitamente al AWS IoT Core servicio permiso para invocar la función en su nombre. Puede hacerlo con el siguiente comando. 

**nota**  
Es posible que el punto de conexión predeterminado de IoT no admita el uso de autorizadores personalizados con funciones de Lambda. En su lugar, puede usar las configuraciones de dominio para definir un nuevo punto de conexión y, a continuación, especificarlo para el 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"
```

# Autorizar la invocación AWS IoT de la función Lambda
<a name="custom-auth-authorize"></a>

En esta sección, concederá el permiso del recurso de autorizador personalizado que acaba de crear para ejecutar la función de Lambda. Para conceder el permiso, puede utilizar el comando de la CLI [add-permission](https://docs.aws.amazon.com//cli/latest/reference/lambda/add-permission.html).

**Conceda permiso a su función Lambda mediante el AWS CLI**

1. Después de insertar sus valores, introduzca el siguiente comando. Tenga en cuenta que el valor `statement-id` debe ser único. Reemplace `Id-1234` por el valor exacto que tiene; de lo contrario, podría producirse un error `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. Si el comando tiene éxito, devuelve una declaración de permiso, como la de este ejemplo. Puede continuar con la siguiente sección para probar el 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\"}}}"
   }
   ```

   Si el comando no tiene éxito, devuelve un error, como en este ejemplo. Tendrá que revisar y corregir el error 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
   ```

# Probar los autorizadores
<a name="custom-auth-testing"></a>

 Puede usar la [TestInvokeAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_TestInvokeAuthorizer.html)API para probar los valores de invocación y retorno de su autorizador. Esta API te permite especificar los metadatos del protocolo y probar la validación de la firma en tu autorizador.

En las siguientes pestañas se muestra cómo utilizarla AWS CLI para probar el 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
```

------

El valor del parámetro `token-signature` es el token firmado. Para obtener información sobre cómo obtener este valor, consulte [Firmar el token](custom-auth.md#custom-auth-token-signature).

Si el autorizador utiliza un nombre de usuario y una contraseña, puede transmitir esta información mediante el parámetro `--mqtt-context`. Las siguientes pestañas muestran cómo usar la API `TestInvokeAuthorizer` para enviar un objeto JSON que contenga un nombre de usuario, una contraseña y un nombre de cliente a su 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"}'
```

------

Los datos de usuario deben estar codificados en base64. El siguiente ejemplo muestra cómo codificar una contraseña en un entorno similar a Unix.

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

# Administración de puntos de conexión
<a name="custom-auth-manage"></a>

 Puede administrar sus autorizadores mediante lo siguiente. APIs 
+ [ListAuthorizers](https://docs.aws.amazon.com/iot/latest/apireference/API_ListAuthorizers.html): Muestra todos los autorizadores de tu cuenta.
+  [DescribeAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeAuthorizer.html): Muestra las propiedades del autorizador especificado. Estos valores incluyen la fecha de creación, la fecha de la última modificación y otros atributos.
+ [SetDefaultAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_SetDefaultAuthorizer.html): Especifica el autorizador predeterminado para los puntos finales de AWS IoT Core datos. AWS IoT Core utiliza este autorizador si un dispositivo no transfiere AWS IoT Core las credenciales y no especifica un autorizador. Para obtener más información sobre el uso de AWS IoT Core credenciales, consulte. [Autenticación del cliente](client-authentication.md)
+ [UpdateAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_UpdateAuthorizer.html): cambia el estado, el nombre de la clave del token o las claves públicas del autorizador especificado.
+  [DeleteAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_DeleteAuthorizer.html): elimina el autorizador especificado. 

**nota**  
 No se puede actualizar el requisito de firma de un autorizador. Esto significa que no es posible deshabilitar el inicio de sesión en un autorizador existente que lo requiera. Tampoco se puede requerir el inicio de sesión en un autorizador existente que no lo requiera. 