Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Cancelar la suscripción de WebSocket las conexiones mediante filtros en AWS AppSync
En AWS AppSync, puedes cancelar la suscripción por la fuerza y cerrar (invalidar) una WebSocket conexión de un cliente conectado en función de una lógica de filtrado específica. Esto resulta útil en contextos de autorización, por ejemplo, cuando se elimina un usuario de un grupo.
La invalidación de la suscripción se produce en respuesta a una carga útil definida en una mutación. Le recomendamos que considere las mutaciones utilizadas para invalidar las conexiones a una suscripción como operaciones administrativas de su API y que ajuste el ámbito de los permisos en consecuencia limitando su uso a un usuario administrador, un grupo o un servicio de backend. Por ejemplo, si utiliza directivas de autorización de esquemas como @aws_auth(cognito_groups:
["Administrators"])
o @aws_iam
. Para obtener más información, consulte Uso de modos de autorización adicionales.
Los filtros de invalidación utilizan la misma sintaxis y lógica que los filtros de suscripción mejorados. Defina estos filtros mediante las siguientes utilidades:
-
extensions.invalidateSubscriptions()
: definido en el controlador de respuestas del solucionador de GraphQL para una mutación. -
extensions.setSubscriptionInvalidationFilter()
: definido en el controlador de respuestas del solucionador de GraphQL de las suscripciones vinculadas a la mutación.
Uso de la invalidación de suscripciones
Para ver cómo funciona la invalidación de suscripciones AWS AppSync, usa el siguiente esquema de 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 }
Defina un filtro de invalidación en el código del solucionador de mutaciones 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 }; }
Cuando se invoca la mutación, los datos definidos en el objeto payload
se utilizan para cancelar la suscripción definida en subscriptionField
. También se define un filtro de invalidación en la plantilla de mapeo de respuestas de la suscripción onGroupMessageCreated
.
Si la extensions.invalidateSubscriptions()
carga útil contiene un ID que coincide con el IDs del cliente suscrito, tal como se define en el filtro, se cancela la suscripción correspondiente. Además, la conexión está cerrada. WebSocket Defina el código del solucionador de suscripciones para la suscripción onGroupMessageCreated
:
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; }
Tenga en cuenta que el controlador de respuestas de suscripción puede tener definidos filtros de suscripción y filtros de invalidación al mismo tiempo.
Por ejemplo, supongamos que el cliente A suscribe a un nuevo usuario con el ID
en el grupo con el ID user-1
mediante la siguiente solicitud de suscripción:group-1
onGroupMessageCreated(userId : "
user-1
", groupId: :"group-1
"){...}
AWS AppSync ejecuta el solucionador de suscripciones, que genera filtros de suscripción e invalidación tal como se definió en la plantilla de mapeo de onGroupMessageCreated
respuestas anterior. Para el cliente A, los filtros de suscripción solo permiten enviar datos a
, y los filtros de invalidación están definidos tanto para group-1
como para user-1
.group-1
Ahora, supongamos que el cliente B suscribe a un usuario con el ID
en el grupo con el ID user-2
mediante la siguiente solicitud de suscripción:group-2
onGroupMessageCreated(userId : "
user-2
", groupId: :"group-2
"){...}
AWS AppSync ejecuta el solucionador de suscripciones, que genera filtros de suscripción e invalidación. Para el cliente B, los filtros de suscripción solo permiten enviar datos a
, y los filtros de invalidación están definidos tanto para group-2
como para user-2
.group-2
A continuación, supongamos que se crea un nuevo mensaje de grupo con el ID
mediante una solicitud de mutación, como en el ejemplo siguiente:message-1
createGroupMessage(id: "
message-1
", groupId : "group-1
", message: "test message"){...}
Los clientes suscritos que coincidan con los filtros definidos reciben automáticamente la siguiente carga útil de datos a través de: WebSockets
{ "data": { "onGroupMessageCreated": { "id": "message-1", "groupId": "group-1", "message": "test message", } } }
El cliente A recibe el mensaje porque los criterios de filtrado coinciden con el filtro de suscripción definido. Sin embargo, el cliente B no recibe el mensaje porque el usuario no forma pertenece a
. Además, la solicitud no coincide con el filtro de suscripción definido en el solucionador de suscripciones.group-1
Por último, supongamos que
se ha eliminado de user-1
con la siguiente solicitud de mutación:group-1
removeUserFromGroup(userId: "user-1", groupId : "group-1"){...}
La mutación provoca la invalidación de la suscripción, tal y como se define en el código del controlador de respuestas del extensions.invalidateSubscriptions()
solucionador. AWS AppSync a continuación, cancela la suscripción del cliente A y cierra su conexión. WebSocket El cliente B no se ve afectado, ya que la carga de invalidación definida en la mutación no coincide con su usuario o grupo.
Cuando se AWS AppSync invalida una conexión, el cliente recibe un mensaje confirmando que se ha dado de baja:
{ "message": "Subscription complete." }
Uso de variables de contexto en los filtros de invalidación de suscripciones
Al igual que con los filtros de suscripción mejorados, puede utilizar la variable context
de la extensión del filtro de invalidación de suscripciones para acceder a determinados datos.
Por ejemplo, puede configurar una dirección de correo electrónico como carga útil de invalidación en la mutación y, a continuación, vincularle una correspondencia con el atributo de correo electrónico o la solicitud de un usuario suscrito autorizado con los grupos de usuarios de Amazon Cognito o con OpenID Connect. El filtro de invalidación definido en el invalidador de suscripciones extensions.setSubscriptionInvalidationFilter()
comprueba si la dirección de correo electrónico establecida por la carga útil extensions.invalidateSubscriptions()
de la mutación coincide con la dirección de correo electrónico recuperada del token JWT del usuario en context.identity.claims.email
, iniciándose así la invalidación.