

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Création et gestion d'autorisateurs personnalisés (CLI)
<a name="config-custom-auth"></a>

AWS IoT Core implémente des schémas d'authentification et d'autorisation personnalisés en utilisant des autorisateurs personnalisés. Un autorisateur personnalisé est une AWS IoT Core ressource qui vous donne la flexibilité de définir et de mettre en œuvre les règles et les politiques en fonction de vos besoins spécifiques. Pour créer un autorisateur personnalisé avec des step-by-step instructions, voir [Tutoriel : Création d'un autorisateur personnalisé](https://docs.aws.amazon.com//iot/latest/developerguide/custom-auth-tutorial.html) pour. AWS IoT Core

Chaque mécanisme d'autorisation se compose des éléments suivants : 
+  *Nom* : Une chaîne unique définie par l'utilisateur qui identifie le mécanisme d'autorisation.
+  *ARN de la fonction Lambda* : Amazon Resource Name (ARN) de la fonction Lambda qui implémente la logique d'autorisation et d'authentification.  
+  *Nom de clé du jeton* : nom de clé utilisé pour extraire le jeton des en-têtes HTTP, des paramètres de requête ou du nom d'utilisateur MQTT CONNECT afin d'effectuer la validation de la signature. Cette valeur est obligatoire si la signature est activée dans votre mécanisme d'autorisation. 
+  *Indicateur de signature désactivée (facultatif)* : valeur booléenne qui spécifie s'il faut désactiver l'exigence de signature sur les informations d'identification. Ceci est utile pour les scénarios dans lesquels la signature des informations d'identification n'a pas de sens, tels que les schémas d'authentification qui utilisent le nom d'utilisateur et le mot de passe MQTT. La valeur par défaut est `false`, la signature est donc activée par défaut. 
+  *Clé publique de signature de jeton* : clé publique que AWS IoT Core utilise pour valider la signature du jeton. Sa longueur minimale est de 2048 bits. Cette valeur est obligatoire si la signature est activée dans votre mécanisme d'autorisation.  

Lambda vous facture le nombre d'exécutions de votre fonction Lambda et le temps nécessaire à l'exécution du code de votre fonction. Pour plus d'informations sur la tarification Lambda, consultez [Tarification Lambda ](https://aws.amazon.com/lambda/pricing/). Pour plus d'informations sur la création de fonctions Lambda, consultez le [Guide du développeur Lambda](https://docs.aws.amazon.com/lambda/latest/dg/).

**Note**  
Si vous laissez la signature activée, vous pouvez empêcher un déclenchement excessif de votre Lambda par des clients non reconnus. Considérez ceci avant de désactiver la connexion à votre mécanisme d'autorisation.

**Note**  
Le délai d'expiration de la fonction Lambda pour le mécanisme d'autorisation personnalisé est de 5 secondes.

**Topics**
+ [Définir votre fonction Lambda](custom-auth-lambda.md)
+ [Création d'un mécanisme d'autorisation](custom-auth-create-authorizer.md)
+ [Autorisation d' AWS IoT invoquer votre fonction Lambda](custom-auth-authorize.md)
+ [Tester vos mécanismes d'autorisation](custom-auth-testing.md)
+ [Gestion des autorisations personnalisées](custom-auth-manage.md)

# Définir votre fonction Lambda
<a name="custom-auth-lambda"></a>

 Lorsque vous AWS IoT Core invoquez votre autorisateur, il déclenche le Lambda associé à l'autorisateur avec un événement contenant l'objet JSON suivant. L'exemple d'objet JSON contient tous les champs possibles. Tous les champs qui ne sont pas pertinents pour la demande de connexion ne sont pas inclus.

```
{
    "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 fonction Lambda doit utiliser ces informations pour authentifier la connexion entrante et décider quelles actions sont autorisées dans la connexion. La fonction doit envoyer une réponse contenant les valeurs suivantes. 
+  `isAuthenticated`: Une valeur booléenne qui indique si la demande est authentifiée.
+  `principalId`: Chaîne alphanumérique qui sert d'identifiant pour le jeton envoyé par la demande d'autorisation personnalisée. La valeur doit être une chaîne alphanumérique contenant au moins un et pas plus de 128 caractères et correspondre à ce modèle d'expression régulière (regex) : `([a-zA-Z0-9]){1,128}`. Les caractères spéciaux qui ne sont pas alphanumériques ne sont pas autorisés à être utilisés avec l'entrée`principalId`. AWS IoT Core Reportez-vous à la documentation des autres AWS services si des caractères spéciaux non alphanumériques sont autorisés pour le. `principalId`
+  `policyDocuments`: liste des documents de AWS IoT Core politique au format JSON Pour plus d'informations sur la création de AWS IoT Core politiques, consultez. [AWS IoT Core politiques](iot-policies.md) Le nombre maximum de documents de stratégie est de 10 documents de stratégie. Chaque document de stratégie peut contenir un maximum de 2048 caractères.
+  `disconnectAfterInSeconds` : Un entier qui spécifie la durée maximale (en secondes) de la connexion à la passerelle AWS IoT Core . La valeur minimale est de 300 secondes et la valeur maximale de 86 400 secondes. La valeur par défaut est 86 400.
**Note**  
La valeur de `disconnectAfterInSeconds` (renvoyée par la fonction Lambda) est définie lorsque la connexion est établie. Cette valeur ne peut pas être modifiée lors des appels Lambda d'actualisation des politiques ultérieurs.
+  `refreshAfterInSeconds`: Un entier qui qui spécifie l’intervalle entre les actualisations de stratégie. Lorsque cet intervalle est écoulé, AWS IoT Core appelle la fonction Lambda pour autoriser l'actualisation des stratégies. La valeur minimale est de 300 secondes et la valeur maximale de 86 400 secondes. 

  L'objet JSON suivant contient un exemple de réponse que votre fonction Lambda peut envoyer. 

 **\$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**

 La `policyDocument` valeur doit contenir un document AWS IoT Core de politique valide. Pour plus d'informations sur AWS IoT Core les politiques, consultez[AWS IoT Core politiques](iot-policies.md). Dans MQTT sur TLS et MQTT sur WebSockets connexions, met en AWS IoT Core cache cette politique pendant l'intervalle spécifié dans la valeur du champ. `refreshAfterInSeconds` Dans le cas des connexions HTTP, la fonction Lambda est appelée pour chaque demande d'autorisation, sauf si votre appareil utilise des connexions HTTP persistantes (également appelées HTTP keep-alive ou HTTP connection reuse). Vous pouvez choisir d'activer la mise en cache lors de la configuration du mécanisme d'autorisation. Pendant cet intervalle, AWS IoT Core autorise les actions dans une connexion établie par rapport à cette politique mise en cache sans déclencher à nouveau votre fonction Lambda. En cas d'échec lors de l'authentification personnalisée, AWS IoT Core met fin à la connexion. AWS IoT Core met également fin à la connexion si elle est ouverte depuis plus longtemps que la valeur spécifiée dans le `disconnectAfterInSeconds` paramètre. 

 Vous trouverez ci-dessous JavaScript un exemple de fonction Lambda Node.js qui recherche un mot de passe dans le message MQTT Connect avec une valeur `test` égale à et renvoie une politique autorisant la connexion AWS IoT Core avec un client `myClientName` nommé et la publication sur une rubrique contenant le même nom de client. S'il ne trouve pas le mot de passe attendu, il renvoie une stratégie qui refuse ces deux actions. 

```
// 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 fonction Lambda précédente renvoie le JSON suivant lorsqu'elle reçoit le mot de passe `test` attendu dans le message MQTT Connect. Les valeurs des propriétés `password` et `principalId` seront les valeurs du message 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
}
```

# Création d'un mécanisme d'autorisation
<a name="custom-auth-create-authorizer"></a>

 Vous pouvez créer un autorisateur à l'aide de l'[CreateAuthorizerAPI](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateAuthorizer.html). L'exemple suivant décrit la commande. 

```
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]
```

Vous pouvez utiliser le paramètre `signing-disabled` pour désactiver la validation de signature pour chaque invocation de votre mécanisme d'autorisation. Nous vous recommandons fortement de ne pas désactiver la signature, sauf si vous y êtes obligé. La validation de signature vous protège contre les appels excessifs de votre fonction Lambda à partir d'appareils inconnus. Vous ne pouvez pas mettre à jour l'état `signing-disabled` d'un organisme d'autorisation après l'avoir créé. Pour modifier ce comportement, vous devez créer un autre mécanisme d'autorisation personnalisé avec une valeur différente pour le paramètre `signing-disabled`. 

Les valeurs des paramètres `tokenKeyName` et `tokenSigningPublicKeys` sont facultatives si vous avez désactivé la signature. Ce sont des valeurs obligatoires si la signature est activée. 

Après avoir créé votre fonction Lambda et l'autorisateur personnalisé, vous devez explicitement accorder au AWS IoT Core service l'autorisation d'appeler la fonction en votre nom. Vous pouvez le faire à l'aide de la commande suivante. 

**Note**  
Le point de terminaison IoT par défaut peut ne pas prendre en charge l'utilisation d'autorisateurs personnalisés dotés de fonctions Lambda. Vous pouvez plutôt utiliser des configurations de domaine pour définir un nouveau point de terminaison, puis spécifier ce point de terminaison pour l'autorisateur personnalisé.

```
aws lambda add-permission --function-name <lambda_function_name>
--principal iot.amazonaws.com --source-arn <authorizer_arn>
--statement-id Id-123 --action "lambda:InvokeFunction"
```

# Autorisation d' AWS IoT invoquer votre fonction Lambda
<a name="custom-auth-authorize"></a>

Dans cette section, vous allez autoriser la ressource d'autorisation personnalisée que vous venez de créer pour exécuter la fonction Lambda. Pour accorder l'autorisation, vous pouvez utiliser la commande CLI [add-permission](https://docs.aws.amazon.com//cli/latest/reference/lambda/add-permission.html).

**Accordez l'autorisation à votre fonction Lambda à l'aide du AWS CLI**

1. Après avoir inséré vos valeurs, entrez la commande suivante. Notez que la valeur `statement-id` doit être unique. Remplacez `Id-1234` par la valeur exacte que vous avez, sinon vous risquez de recevoir une `ResourceConflictException` erreur.

   ```
   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 la commande aboutit, elle renvoie une instruction d'autorisation, comme dans cet exemple. Vous pouvez passer à la section suivante pour tester le mécanisme d’autorisation personnalisée.

   ```
   {
       "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 la commande échoue, elle renvoie une erreur, comme dans cet exemple. Vous devez vérifier et corriger l'erreur avant de continuer.

   ```
   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
   ```

# Tester vos mécanismes d'autorisation
<a name="custom-auth-testing"></a>

 Vous pouvez utiliser l'[TestInvokeAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_TestInvokeAuthorizer.html)API pour tester les valeurs d'invocation et de retour de votre autorisateur. Cette API vous permet de spécifier les métadonnées du protocole et de tester la validation de signature dans votre autorisateur.

Les onglets suivants montrent comment utiliser le AWS CLI pour tester votre autorisateur.

------
#### [ 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
```

------

La valeur du paramètre `token-signature` est le jeton signé. Pour savoir comment obtenir cette valeur, consultez [Signer le jeton](custom-auth.md#custom-auth-token-signature).

Si votre mécanisme d'autorisation prend un nom d'utilisateur et un mot de passe, vous pouvez transmettre ces informations en utilisant le paramètre `--mqtt-context`. Les onglets suivants montrent comment utiliser l'API `TestInvokeAuthorizer` pour envoyer un objet JSON contenant un nom d'utilisateur, un mot de passe et un nom de client à votre mécanisme d'autorisation personnalisé.

------
#### [ 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"}'
```

------

Le mot de passe doit être codé en base64. L'exemple suivant montre comment coder un mot de passe dans un environnement de type Unix.

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

# Gestion des autorisations personnalisées
<a name="custom-auth-manage"></a>

 Vous pouvez gérer vos autorisateurs à l'aide des méthodes suivantes APIs. 
+ [ListAuthorizers](https://docs.aws.amazon.com/iot/latest/apireference/API_ListAuthorizers.html): Afficher tous les autorisateurs de votre compte.
+  [DescribeAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeAuthorizer.html): affiche les propriétés de l'autorisateur spécifié. Ces valeurs incluent la date de création, la date de la dernière modification et d'autres attributs.
+ [SetDefaultAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_SetDefaultAuthorizer.html): Spécifie l'autorisateur par défaut pour vos points de terminaison AWS IoT Core de données. AWS IoT Core utilise cet autorisateur si un appareil ne transmet pas les AWS IoT Core informations d'identification et ne spécifie pas d'autorisateur. Pour plus d'informations sur l'utilisation des AWS IoT Core informations d'identification, consultez[Authentification client](client-authentication.md).
+ [UpdateAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_UpdateAuthorizer.html): modifie le statut, le nom de la clé du jeton ou les clés publiques de l'autorisateur spécifié.
+  [DeleteAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_DeleteAuthorizer.html): Supprime l'autorisateur spécifié. 

**Note**  
 Vous ne pouvez pas mettre à jour les exigences de signature d'un mécanisme d'autorisation. Cela signifie que vous ne pouvez pas désactiver la connexion si un mécanisme d'autorisation existant l'exige. Vous ne pouvez pas non plus exiger la connexion d’un mécanisme d’autorisation existant qui ne l’exige pas. 