Annullamento dell'iscrizione alle WebSocket connessioni utilizzando i filtri in AWS AppSync - AWS AppSync

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Annullamento dell'iscrizione alle WebSocket connessioni utilizzando i filtri in AWS AppSync

In AWS AppSync, puoi annullare forzatamente l'iscrizione e chiudere (invalidare) una WebSocket connessione da un client connesso in base a una logica di filtraggio specifica. Ciò è utile in scenari relativi all'autorizzazione, ad esempio quando si rimuove un utente da un gruppo.

L'invalidazione dell'abbonamento si verifica in risposta a un payload definito in una mutazione. Ti consigliamo di considerare le mutazioni utilizzate per invalidare le connessioni di sottoscrizione come operazioni amministrative nell'ambito delle tue autorizzazioni API e di definire di conseguenza le autorizzazioni limitandone l'uso a un utente amministratore, un gruppo o un servizio di backend. Ad esempio, utilizzando direttive di autorizzazione dello schema come o. @aws_auth(cognito_groups: ["Administrators"]) @aws_iam Per ulteriori informazioni, vedere Utilizzo di modalità di autorizzazione aggiuntive.

I filtri di invalidazione utilizzano la stessa sintassi e logica dei filtri di sottoscrizione avanzati. Definite questi filtri utilizzando le seguenti utilità:

  • extensions.invalidateSubscriptions()— Definito nel gestore di risposte del resolver GraphQL per una mutazione.

  • extensions.setSubscriptionInvalidationFilter()— Definito nel gestore delle risposte del resolver GraphQL degli abbonamenti collegati alla mutazione.

Per ulteriori informazioni sulle estensioni di filtro di invalidazione, consulta la panoramica dei resolver. JavaScript

Utilizzo dell'invalidazione dell'abbonamento

Per vedere come funziona l'invalidazione dell'abbonamento AWS AppSync, usa il seguente schema GraphQL:

type User { userId: ID! groupId: ID! } type Group { groupId: ID! name: String! members: [ID!]! } type GroupMessage { userId: ID! groupId: ID! message: String! } type Mutation { createGroupMessage(userId: ID!, groupId : ID!, message: String!): GroupMessage removeUserFromGroup(userId: ID!, groupId : ID!) : User @aws_iam } type Subscription { onGroupMessageCreated(userId: ID!, groupId : ID!): GroupMessage @aws_subscribe(mutations: ["createGroupMessage"]) } type Query { none: String }

Definisci un filtro di invalidazione nel codice del mutation resolver: removeUserFromGroup

import { extensions } from '@aws-appsync/utils'; export function request(ctx) { return { payload: null }; } export function response(ctx) { const { userId, groupId } = ctx.args; extensions.invalidateSubscriptions({ subscriptionField: 'onGroupMessageCreated', payload: { userId, groupId }, }); return { userId, groupId }; }

Quando viene richiamata la mutazione, i dati definiti nell'payloadoggetto vengono utilizzati per annullare l'iscrizione definita in. subscriptionField Un filtro di invalidazione è inoltre definito nel modello di mappatura delle risposte dell'onGroupMessageCreatedabbonamento.

Se il extensions.invalidateSubscriptions() payload contiene un ID che corrisponde a quello del IDs client sottoscritto come definito nel filtro, l'abbonamento corrispondente viene annullato. Inoltre, la connessione è chiusa. WebSocket Definisci il codice del resolver di sottoscrizione per l'onGroupMessageCreatedabbonamento:

import { util, extensions } from '@aws-appsync/utils'; export function request(ctx) { // simplfy return null for the payload return { payload: null }; } export function response(ctx) { const filter = { groupId: { eq: ctx.args.groupId } }; extensions.setSubscriptionFilter(util.transform.toSubscriptionFilter(filter)); const invalidation = { groupId: { eq: ctx.args.groupId }, userId: { eq: ctx.args.userId } }; extensions.setSubscriptionInvalidationFilter(util.transform.toSubscriptionFilter(invalidation)); return null; }

Tieni presente che il gestore della risposta alla sottoscrizione può avere sia filtri di sottoscrizione che filtri di invalidazione definiti contemporaneamente.

Ad esempio, supponiamo che il client A iscriva un nuovo utente con l'ID user-1 al gruppo con l'ID group-1 utilizzando la seguente richiesta di iscrizione:

onGroupMessageCreated(userId : "user-1", groupId: :"group-1"){...}

AWS AppSync esegue il resolver di sottoscrizione, che genera filtri di sottoscrizione e invalidazione come definito nel precedente modello di mappatura delle risposte. onGroupMessageCreated Per il client A, i filtri di sottoscrizione consentono l'invio dei dati solo agroup-1, mentre i filtri di invalidazione sono definiti per entrambi e. user-1 group-1

Supponiamo ora che il client B sottoscriva un utente con l'ID user-2 a un gruppo con l'ID group-2 utilizzando la seguente richiesta di iscrizione:

onGroupMessageCreated(userId : "user-2", groupId: :"group-2"){...}

AWS AppSync esegue il resolver di sottoscrizione, che genera filtri di sottoscrizione e invalidazione. Per il client B, i filtri di sottoscrizione consentono l'invio dei dati solo agroup-2, mentre i filtri di invalidazione sono definiti per entrambi e. user-2 group-2

Quindi, supponiamo che un nuovo messaggio di gruppo con l'ID message-1 venga creato utilizzando una richiesta di mutazione come nell'esempio seguente:

createGroupMessage(id: "message-1", groupId : "group-1", message: "test message"){...}

I client abbonati che corrispondono ai filtri definiti ricevono automaticamente il seguente payload di dati tramite: WebSockets

{ "data": { "onGroupMessageCreated": { "id": "message-1", "groupId": "group-1", "message": "test message", } } }

Il client A riceve il messaggio perché i criteri di filtraggio corrispondono al filtro di sottoscrizione definito. Tuttavia, il client B non riceve il messaggio, in quanto l'utente non ne fa partegroup-1. Inoltre, la richiesta non corrisponde al filtro di sottoscrizione definito nel resolver di sottoscrizione.

Infine, supponiamo che user-1 venga rimosso dall'group-1utilizzo della seguente richiesta di mutazione:

removeUserFromGroup(userId: "user-1", groupId : "group-1"){...}

La mutazione avvia un'invalidazione dell'abbonamento come definito nel codice del gestore della risposta del resolver. extensions.invalidateSubscriptions() AWS AppSync quindi annulla l'iscrizione al client A e chiude la sua connessione. WebSocket Il client B non è interessato, poiché il payload di invalidazione definito nella mutazione non corrisponde al suo utente o gruppo.

Quando AWS AppSync invalida una connessione, il client riceve un messaggio che conferma che l'iscrizione è stata annullata:

{ "message": "Subscription complete." }

Utilizzo di variabili di contesto nei filtri di invalidazione delle sottoscrizioni

Come per i filtri di sottoscrizione avanzati, puoi utilizzare la contextvariabile nell'estensione del filtro di invalidazione dell'abbonamento per accedere a determinati dati.

Ad esempio, è possibile configurare un indirizzo e-mail come payload di invalidazione nella mutazione, quindi confrontarlo con l'attributo email o la dichiarazione di un utente abbonato autorizzato con i pool di utenti di Amazon Cognito o OpenID Connect. Il filtro di invalidazione definito nell'invalidatore dell'extensions.setSubscriptionInvalidationFilter()abbonamento verifica se l'indirizzo e-mail impostato dal extensions.invalidateSubscriptions() payload della mutazione corrisponde all'indirizzo e-mail recuperato dal token dell'utente, avviando l'invalidazione. JWT context.identity.claims.email