의 필터를 사용하여 WebSocket 연결 구독 취소 AWS AppSync - AWS AppSync GraphQL

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

의 필터를 사용하여 WebSocket 연결 구독 취소 AWS AppSync

에서는 특정 필터링 로직을 기반으로 연결된 클라이언트에서 WebSocket 연결을 강제로 구독 취소하고 닫을 AWS AppSync수 있습니다(무효화). 이 기능은 그룹에서 사용자를 제거하는 경우와 같은 권한 부여 관련 시나리오에서 유용합니다.

구독 무효화는 변형에 정의된 페이로드에 대한 응답으로 발생합니다. 구독 연결을 무효화하는 데 사용되는 변형는 API의 관리 작업으로 취급하고 그에 따라 관리 사용자, 그룹 또는 백엔드 서비스로 사용을 제한하여 권한 범위를 지정하는 것이 좋습니다. 예를 들어 @aws_auth(cognito_groups: ["Administrators"]) 또는 @aws_iam과 같은 스키마 권한 부여 지시문을 사용할 수 있습니다. 자세한 내용은 추가 권한 부여 모드 사용을 참조하세요.

무효화 필터는 향상된 구독 필터와 동일한 구문 및 로직을 사용합니다. 다음 유틸리티를 사용하여 이러한 필터를 정의하세요.

  • extensions.invalidateSubscriptions() - 변형에 대한 GraphQL 해석기의 응답 핸들러에서 정의됩니다.

  • extensions.setSubscriptionInvalidationFilter() - 변형에 연결된 구독의 GraphQL해석기의 응답 핸들러에서 정의됩니다.

무효화 필터링 확장에 대한 자세한 내용은 JavaScript 해석기 개요를 참조하세요.

구독 무효화 사용

구독 무효화의 작동 방식을 확인하려면 다음 GraphQL 스키마를 AWS AppSync사용합니다.

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 }

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

변형이 간접적으로 호출되면 subscriptionField에 정의된 구독을 취소하는 데 payload 객체에 정의된 데이터가 사용됩니다. 무효화 필터는 onGroupMessageCreated 구독의 응답 매핑 템플릿에도 정의되어 있습니다.

필터에 정의된 대로 구독한 클라이언트의 ID와 일치하는 ID가 extensions.invalidateSubscriptions() 페이로드에 포함된 경우 해당 구독은 구독 취소됩니다. 또한 WebSocket 연결도 종료됩니다. 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; }

참고로 구독 응답 핸들러에는 구독 필터와 무효화 필터를 동시에 정의할 수 있습니다.

예를 들어 클라이언트 A가 다음 구독 요청을 사용하여 ID가 group-1인 그룹에 ID가 user-1인 새로운 사용자를 구독한다고 가정해 보겠습니다.

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

AWS AppSync 는 이전 onGroupMessageCreated 응답 매핑 템플릿에 정의된 대로 구독 및 무효화 필터를 생성하는 구독 해석기를 실행합니다. 클라이언트 A의 경우 구독 필터는 데이터가 group-1로만 전송될 수 있게 하며, 무효화 필터는 user-1group-1 모두에 대해 정의됩니다.

이제 클라이언트 B가 다음 구독 요청을 사용하여 ID가 group-2인 그룹에 ID가 user-2인 사용자를 구독한다고 가정해 보겠습니다.

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

AWS AppSync 는 구독 및 무효화 필터를 생성하는 구독 해석기를 실행합니다. 클라이언트 B의 경우 구독 필터는 데이터가 group-2로만 전송될 수 있게 하며, 무효화 필터는 user-2group-2 모두에 대해 정의됩니다.

다음으로, 다음 예와 같이 변형 요청을 사용하여 ID가 message-1인 새로운 그룹 메시지를 생성한다고 가정해 보겠습니다.

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

정의된 필터와 일치하는 구독 클라이언트는 WebSocket을 통해 다음 데이터 페이로드를 자동으로 수신합니다.

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

필터링 기준이 정의된 구독 필터와 일치하므로 클라이언트 A가 메시지를 수신합니다. 하지만 사용자가 group-1에 속하지 않으므로 클라이언트 B는 메시지를 수신하지 않습니다. 또한 요청이 구독 해석기에 정의된 구독 필터와 일치하지 않습니다.

마지막으로, 다음 변형 요청을 사용하여 user-1group-1에서 제거되었다고 가정해 보겠습니다.

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

변형은 extensions.invalidateSubscriptions() 해석기 응답 핸들러 코드에 정의된 대로 구독 무효화를 시작한 AWS AppSync 다음 클라이언트 A의 구독을 취소하고 WebSocket 연결을 닫습니다. 변형에 정의된 무효화 페이로드가 해당 사용자 또는 그룹과 일치하지 않으므로 클라이언트 B는 영향을 받지 않습니다.

가 연결을 AWS AppSync 무효화하면 클라이언트는 구독 취소되었음을 확인하는 메시지를 받습니다.

{ "message": "Subscription complete." }

구독 무효화 필터에 컨텍스트 변수 사용

향상된 구독 필터와 마찬가지로 구독 무효화 필터 확장의 context 변수를 사용하여 특정 데이터에 액세스할 수 있습니다.

예를 들어, 이메일 주소를 변형의 무효화 페이로드로 구성한 다음 Amazon Cognito 사용자 풀 또는 OpenID Connect를 통해 권한이 부여된 구독 사용자의 이메일 특성 또는 클레임과 일치시킬 수 있습니다. extensions.setSubscriptionInvalidationFilter() 구독 무효 검증기에 정의된 무효화 필터는 변형의 extensions.invalidateSubscriptions() 페이로드에 의해 설정된 이메일 주소가 context.identity.claims.email에 있는 사용자의 JWT 토큰에서 검색된 이메일 주소와 일치하는지 확인하여 무효화를 시작합니다.