

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.

# Connexion à l' AWS IoT Core aide de l'authentification personnalisée
<a name="custom-auth"></a>

 Les appareils peuvent se connecter à AWS IoT Core l'aide d'une authentification personnalisée avec n'importe quel protocole prenant AWS IoT Core en charge la messagerie des appareils. Pour plus d'informations sur les protocoles de communication pris en charge, consultez [Protocoles de communication des appareils](protocols.md).  Les données de connexion que vous transmettez à votre fonction Lambda d'autorisation dépendent du protocole que vous utilisez. Pour plus d'informations sur la création de votre fonction Lambda d'autorisation, consultez [Définir votre fonction Lambda](custom-auth-lambda.md). Les sections suivantes expliquent comment se connecter pour s'authentifier à l'aide de chaque protocole pris en charge.

## HTTPS
<a name="custom-auth-http"></a>

Les appareils qui envoient des données à AWS IoT Core l'aide de l'[API HTTP Publish](https://docs.aws.amazon.com/iot/latest/apireference/API_iotdata_Publish.html) peuvent transmettre des informations d'identification par le biais d'en-têtes de requête ou de paramètres de requête dans leurs requêtes HTTP POST. Les appareils peuvent spécifier un mécanisme d'autorisation à invoquer à l'aide du paramètre d'en-tête `x-amz-customauthorizer-name` ou de requête. Si la signature de jetons est activée dans votre mécanisme d'autorisation, vous devez transmettre le `token-key-name` et `x-amz-customauthorizer-signature` dans les en-têtes ou paramètres de requête. Notez que la `token-signature` valeur doit être codée en URL lorsque vous l'utilisez JavaScript depuis le navigateur.

**Note**  
Le mécanisme d'autorisation client pour le protocole HTTPS prend uniquement en charge les opérations de publication. Pour plus d'informations sur le protocole HTTPS, consultez [Protocoles de communication des appareils](protocols.md).

Les exemples de requêtes suivants montrent comment transmettre ces paramètres dans les en-têtes et paramètres de requête. 

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

 Les appareils qui se connectent à AWS IoT Core l'aide d'une connexion MQTT peuvent transmettre des informations d'identification via les `password` champs `username` et des messages MQTT. La valeur `username` peut éventuellement contenir une chaîne de requête qui transmet des valeurs supplémentaires (y compris un jeton, une signature et un nom du mécanisme d'autorisation) à votre mécanisme d'autorisation. Vous pouvez utiliser cette chaîne de requête si vous souhaitez utiliser un schéma d'authentification basé sur un jeton au lieu des valeurs `password` et `username`.  

**Note**  
 Les données du champ du mot de passe sont codées en base64 par. AWS IoT Core Votre fonction Lambda doit le décoder. 

 L'exemple suivant contient une chaîne `username` contenant des paramètres supplémentaires spécifiant un jeton et une signature.  

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

Pour appeler un autorisateur, les appareils qui se connectent à l'aide AWS IoT Core de MQTT et d'une authentification personnalisée doivent se connecter sur le port 443. Ils doivent également transmettre l'extension TLS ALPN (Application Layer Protocol Negotiation) avec une valeur égale à `mqtt` et l'extension SNI (Server Name Indication) avec le nom d'hôte de leur AWS IoT Core point de terminaison de données. Pour éviter des erreurs potentielles, la valeur de `x-amz-customauthorizer-signature` doit être codée en URL. Nous recommandons fortement que les valeurs de `x-amz-customauthorizer-name` et `token-key-name` soient codées en URL. Pour plus d'informations sur ces valeurs, consultez [Protocoles de communication des appareils](protocols.md). Le [AWS IoT Appareil SDKs, appareil mobile SDKs et client AWS IoT d'appareil](iot-sdks.md) V2 peut configurer ces deux extensions. 

## MQTT terminé WebSockets
<a name="custom-auth-websockets"></a>

 Les appareils qui se connectent à AWS IoT Core l'aide de MQTT over WebSockets peuvent transmettre des informations d'identification de l'une des deux manières suivantes. 
+ Via les en-têtes de requête ou les paramètres de requête contenus dans la demande HTTP UPGRADE pour établir la WebSockets connexion.
+ Via les champs `username` et `password` dans le message MQTT CONNECT.

 Si vous transmettez les informations d'identification via le message de connexion MQTT, les extensions ALPN et SNI TLS sont requises. Pour plus d'informations sur ces extensions, consultez [MQTT](#custom-auth-mqtt). L'exemple suivant montre comment transmettre les informations d'identification via la demande de mise à niveau 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
```

## Signer le jeton
<a name="custom-auth-token-signature"></a>

Vous devez signer le jeton avec la clé privée de la paire de clés publique-privée que vous avez utilisée lors de l'appel `create-authorizer`. Les exemples suivants montrent comment créer la signature du jeton à l'aide d'une commande de type Unix et. JavaScript Ils utilisent l'algorithme de hachage SHA-256 pour coder la signature.

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

------