Gestione di utenti connessi e app client: instradamenti $connect e $disconnect - Amazon API Gateway

Gestione di utenti connessi e app client: instradamenti $connect e $disconnect

La sezione seguente descrive come utilizzare gli instradamenti $connect e $disconnect per l'API WebSocket.

Instradamento $connect

App client connesse all'API WebSocket inviando una richiesta di aggiornamento WebSocket. Se la richiesta ha esito positivo, la route $connect viene eseguita mentre la connessione viene stabilita.

Poiché la connessione WebSocket è una connessione stateful, puoi configurare l'autorizzazione solo nella route $connect. AuthN/AuthZ verrà eseguito solo al momento della connessione.

Finché l'esecuzione dell'integrazione associata alla route $connect non viene completata, la richiesta di aggiornamento è in sospeso e la connessione effettiva non verrà stabilita. Se la richiesta $connect ha esito negativo (ad esempio, a causa di un errore AuthN/AuthZ o errore di integrazione), la connessione non verrà stabilita.

Nota

Se l'autorizzazione ha esito negativo su $connect, la connessione non verrà stabilita e il client riceverà una risposta 401 o 403.

La configurazione di un'integrazione per $connect è facoltativa. È opportuno valutare la configurazione di un'integrazione $connect se:

  • Si desidera consentire ai client di specificare sottoprotocolli utilizzando il campo Sec-WebSocket-Protocol. Per il codice di esempio, consulta Configurazione di un'instradamento $connect che richiede un sottoprotocollo WebSocket.

  • Desideri ricevere una notifica in caso di connessione dei client.

  • Desideri limitare le connessioni o controllare chi si connette.

  • Desideri che il back-end invii messaggi ai client utilizzando un URL di callback.

  • Desideri archiviare ogni ID connessione e altre informazioni in un database (ad esempio Amazon DynamoDB).

Passaggio delle informazioni di connessione dalla route $connect

È possibile utilizzare integrazioni proxy e non proxy per passare informazioni dall'instradamento $connect a un database o a un altro Servizio AWS.

Per passare le informazioni di connessione utilizzando un'integrazione proxy

È possibile accedere alle informazioni di connessione da un'integrazione proxy Lambda nell'evento. Utilizzare un altro Servizio AWS o una funzione AWS Lambda per pubblicare nella connessione.

La seguente funzione Lambda mostra come utilizzare l'oggetto requestContext per registrare l'ID di connessione, il nome di dominio, il nome della fase e le stringhe di query.

Node.js
export const handler = async(event, context) => { const connectId = event["requestContext"]["connectionId"] const domainName = event["requestContext"]["domainName"] const stageName = event["requestContext"]["stage"] const qs = event['queryStringParameters'] console.log('Connection ID: ', connectId, 'Domain Name: ', domainName, 'Stage Name: ', stageName, 'Query Strings: ', qs ) return {"statusCode" : 200} };
Python
import json import logging logger = logging.getLogger() logger.setLevel("INFO") def lambda_handler(event, context): connectId = event["requestContext"]["connectionId"] domainName = event["requestContext"]["domainName"] stageName = event["requestContext"]["stage"] qs = event['queryStringParameters'] connectionInfo = { 'Connection ID': connectId, 'Domain Name': domainName, 'Stage Name': stageName, 'Query Strings': qs} logging.info(connectionInfo) return {"statusCode": 200}

Per passare informazioni di connessione utilizzando un'integrazione proxy

  • È possibile accedere alle informazioni di connessione da un'integrazione non proxy. Configurare la richiesta di integrazione e fornire un modello di richiesta API WebSocket. Il seguente modello di mappatura Velocity Template Language (VTL) fornisce una richiesta di integrazione. Questa richiesta invia i seguenti dettagli a un'integrazione non proxy:

    • ID connessione

    • Nome dominio

    • Nome fase

    • Path

    • Headers

    • Stringhe di query

    Questa richiesta invia l'ID di connessione, il nome di dominio, il nome della fase i percorsi, le intestazioni e le stringhe di query a un'integrazione non proxy.

    { "connectionId": "$context.connectionId", "domain": "$context.domainName", "stage": "$context.stage", "params": "$input.params()" }

    Per ulteriori informazioni sulla configurazione delle trasformazioni di dati, consulta Trasformazioni dei dati per API WebSocket in Gateway API.

    Per completare la richiesta di integrazione, impostare StatusCode: 200 per la risposta di integrazione. Per ulteriori informazioni sulla configurazione di una risposta di integrazione, consulta Configurazione di una risposta di integrazione mediante la console API Gateway.

Instradamento $disconnect

La route $disconnect viene eseguita dopo la chiusura della connessione.

La connessione può essere chiusa dal server o dal client. Poiché la connessione è già chiusa quando viene eseguita, $disconnect è un evento best-effort. API Gateway farà il massimo per consegnare l'evento $disconnect all'integrazione, ma non può garantire la consegna.

Il back-end è in grado di avviare la disconnessione utilizzando l'API @connections. Per ulteriori informazioni, consulta Utilizzo di comandi @connections nel servizio di back-end.