Configuration d’une route $connect exigeant un sous-protocole WebSocket
Les clients peuvent utiliser le champ Sec-WebSocket-Protocol pour demander un sous-protocole WebSocket$connect afin d’autoriser les connexions uniquement si un client demande un sous-protocole pris en charge par votre API.
L’exemple de fonction Lambda suivant renvoie l’en-tête Sec-WebSocket-Protocol aux clients. La fonction établit une connexion à votre API uniquement si le client spécifie le sous-protocole myprotocol.
Pour un modèle AWS CloudFormation qui crée cet exemple d’intégration d’API et de proxy Lambda, consultez ws-subprotocol.yaml.
export const handler = async (event) => { if (event.headers != undefined) { const headers = toLowerCaseProperties(event.headers); if (headers['sec-websocket-protocol'] != undefined) { const subprotocolHeader = headers['sec-websocket-protocol']; const subprotocols = subprotocolHeader.split(','); if (subprotocols.indexOf('myprotocol') >= 0) { const response = { statusCode: 200, headers: { "Sec-WebSocket-Protocol" : "myprotocol" } }; return response; } } } const response = { statusCode: 400 }; return response; }; function toLowerCaseProperties(obj) { var wrapper = {}; for (var key in obj) { wrapper[key.toLowerCase()] = obj[key]; } return wrapper; }
Vous pouvez utiliser wscat-s pour spécifier des sous-protocoles pendant la connexion.
La commande suivante tente une connexion avec un sous-protocole non pris en charge. Étant donné que le client a spécifié le sous-protocole chat1, l’intégration Lambda renvoie une erreur 400 et la connexion échoue.
wscat -c wss://api-id.execute-api.region.amazonaws.com/beta-s chat1error: Unexpected server response: 400
La commande suivante inclut un sous-protocole pris en charge dans la demande de connexion. L’intégration Lambda permet la connexion.
wscat -c wss://api-id.execute-api.region.amazonaws.com/beta-s chat1,myprotocolconnected (press CTRL+C to quit)
Pour plus d’informations sur l’appel des API WebSocket, consultez Invocation d’une API WebSocket.