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.
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'payload
oggetto vengono utilizzati per annullare l'iscrizione definita in. subscriptionField
Un filtro di invalidazione è inoltre definito nel modello di mappatura delle risposte dell'onGroupMessageCreated
abbonamento.
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'onGroupMessageCreated
abbonamento:
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
al gruppo con l'ID user-1
utilizzando la seguente richiesta di iscrizione:group-1
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 a
, mentre i filtri di invalidazione sono definiti per entrambi e. group-1
user-1
group-1
Supponiamo ora che il client B sottoscriva un utente con l'ID
a un gruppo con l'ID user-2
utilizzando la seguente richiesta di iscrizione:group-2
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 a
, mentre i filtri di invalidazione sono definiti per entrambi e. group-2
user-2
group-2
Quindi, supponiamo che un nuovo messaggio di gruppo con l'ID
venga creato utilizzando una richiesta di mutazione come nell'esempio seguente:message-1
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 parte
. Inoltre, la richiesta non corrisponde al filtro di sottoscrizione definito nel resolver di sottoscrizione.group-1
Infine, supponiamo che
venga rimosso dall'user-1
utilizzo della seguente richiesta di mutazione:group-1
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 context
variabile 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