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.
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
für die Gruppe user-1
mit der ID abonniert:group-1
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 an
, und die Invalidierungsfilter sind sowohl für als auch definiert. group-1
user-1
group-1
Gehen Sie nun davon aus, dass Client B mithilfe der folgenden Abonnementanforderung
einen Benutzer mit der ID für eine Gruppe user-2
mit der ID abonniert:group-2
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 an
, und die Invalidierungsfilter sind sowohl für als auch definiert. group-2
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
wird:message-1
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 ist
. Außerdem entspricht die Anfrage nicht dem Abonnementfilter, der im Abonnement-Resolver definiert ist.group-1
Gehen Sie abschließend davon aus, dass
dies aus der user-1
Verwendung der folgenden Mutationsanforderung entfernt wurde:group-1
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 context
Variable 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