WebSocket Verbindungen mithilfe von Filtern abbestellen in AWS AppSync - AWS AppSync GraphQL

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

WebSocket Verbindungen mithilfe von Filtern abbestellen in AWS AppSync

In AWS AppSync können Sie eine WebSocket Verbindung mit einem verbundenen Client auf der Grundlage einer bestimmten Filterlogik zwangsweise abbestellen und schließen (für ungültig erklären). Dies ist in autorisierungsbezogenen Szenarien nützlich, z. B. wenn Sie einen Benutzer aus einer Gruppe entfernen.

Die Invalidierung eines Abonnements erfolgt als Reaktion auf eine in einer Mutation definierte Nutzlast. Wir empfehlen, Mutationen, mit denen Abonnementverbindungen ungültig gemacht werden, als administrative Operationen in Ihrer API zu behandeln und die Berechtigungen entsprechend einzuschränken, indem Sie ihre Verwendung auf einen Admin-Benutzer, eine Gruppe oder einen Back-End-Dienst beschränken. Verwenden Sie beispielsweise Schemaautorisierungsrichtlinien wie @aws_auth(cognito_groups: ["Administrators"]) oder. @aws_iam Weitere Informationen finden Sie unter Zusätzliche Autorisierungsmodi verwenden.

Invalidierungsfilter verwenden dieselbe Syntax und Logik wie erweiterte Abonnementfilter. Definieren Sie diese Filter mithilfe der folgenden Dienstprogramme:

  • extensions.invalidateSubscriptions()— Definiert im Response-Handler des GraphQL-Resolvers für eine Mutation.

  • extensions.setSubscriptionInvalidationFilter()— Definiert im Response-Handler des GraphQL-Resolvers für die mit der Mutation verknüpften Abonnements.

Weitere Informationen zu Erweiterungen der Invalidierungsfilterung finden Sie JavaScript in der Übersicht über Resolver.

Verwenden der Abonnement-Invalidierung

Verwenden Sie das folgende GraphQL-Schema, um zu sehen AWS AppSync, wie die Invalidierung von Abonnements funktioniert:

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 }

Definieren Sie einen Invalidierungsfilter im removeUserFromGroup Mutationsauflösungscode:

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 }; }

Wenn die Mutation aufgerufen wird, werden die im payload Objekt definierten Daten verwendet, um das in definierte Abonnement zu kündigen. subscriptionField In der Antwortzuordnungsvorlage des onGroupMessageCreated Abonnements ist auch ein Invalidierungsfilter definiert.

Wenn die extensions.invalidateSubscriptions() Payload eine ID enthält, die der ID des IDs abonnierten Clients entspricht, wie im Filter definiert, wird das entsprechende Abonnement abgemeldet. Außerdem wird die Verbindung geschlossen. WebSocket Definieren Sie den Abonnement-Resolver-Code für das onGroupMessageCreated Abonnement:

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; }

Beachten Sie, dass im Antworthandler für Abonnements sowohl Abonnementfilter als auch Invalidierungsfilter gleichzeitig definiert werden können.

Nehmen wir beispielsweise an, dass Client A mithilfe der folgenden Abonnementanforderung einen neuen Benutzer mit der ID user-1 für die Gruppe group-1 mit der ID abonniert:

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

AWS AppSync führt den Abonnement-Resolver aus, der Abonnement- und Invalidierungsfilter generiert, wie in der vorherigen onGroupMessageCreated Antwortzuordnungsvorlage definiert. Für Client A ermöglichen die Abonnementfilter das Senden von Daten nur angroup-1, und die Invalidierungsfilter sind sowohl für als auch definiert. user-1 group-1

Gehen Sie nun davon aus, dass Client B mithilfe der folgenden Abonnementanforderung user-2 einen Benutzer mit der ID für eine Gruppe group-2 mit der ID abonniert:

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

AWS AppSync führt den Abonnement-Resolver aus, der Abonnement- und Invalidierungsfilter generiert. Für Client B ermöglichen die Abonnementfilter das Senden von Daten nur angroup-2, und die Invalidierungsfilter sind sowohl für als auch definiert. user-2 group-2

Gehen Sie als Nächstes davon aus, dass eine neue Gruppennachricht mit der ID mithilfe einer Mutationsanforderung wie im folgenden Beispiel erstellt message-1 wird:

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

Abonnierte Clients, die den definierten Filtern entsprechen, erhalten automatisch die folgenden Datennutzdaten über: WebSockets

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

Client A erhält die Nachricht, weil die Filterkriterien mit dem definierten Abonnementfilter übereinstimmen. Client B empfängt die Nachricht jedoch nicht, da der Benutzer nicht Teil von istgroup-1. Außerdem entspricht die Anfrage nicht dem Abonnementfilter, der im Abonnement-Resolver definiert ist.

Gehen Sie abschließend davon aus, dass user-1 dies aus der group-1 Verwendung der folgenden Mutationsanforderung entfernt wurde:

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

Die Mutation leitet eine Abonnement-Invalidierung ein, wie sie in ihrem extensions.invalidateSubscriptions() Resolver-Antworthandlercode definiert ist. AWS AppSync meldet dann Client A ab und schließt seine Verbindung. WebSocket Client B ist davon nicht betroffen, da die in der Mutation definierte Payload für die Invalidierung nicht mit seinem Benutzer oder seiner Gruppe übereinstimmt.

Wenn eine Verbindung für AWS AppSync ungültig erklärt wird, erhält der Client eine Nachricht, in der bestätigt wird, dass er sich abgemeldet hat:

{ "message": "Subscription complete." }

Verwendung von Kontextvariablen in Filtern für die Invalidierung von Abonnements

Wie bei erweiterten Abonnementfiltern können Sie die contextVariable in der Erweiterung für den Abonnement-Invalidierungsfilter verwenden, um auf bestimmte Daten zuzugreifen.

Beispielsweise ist es möglich, eine E-Mail-Adresse als Payload für die Invalidierung in der Mutation zu konfigurieren und sie dann mit dem E-Mail-Attribut oder dem Anspruch eines abonnierten Benutzers abzugleichen, der mit Amazon Cognito Cognito-Benutzerpools oder OpenID Connect autorisiert ist. Der im extensions.setSubscriptionInvalidationFilter() Abonnement-Invalidator definierte Invalidierungsfilter prüft, ob die durch die extensions.invalidateSubscriptions() Payload der Mutation festgelegte E-Mail-Adresse mit der E-Mail-Adresse übereinstimmt, die aus dem JWT-Token des Benutzers abgerufen wurde, wodurch die Ungültigerklärung eingeleitet wird. context.identity.claims.email