選取您的 Cookie 偏好設定

我們使用提供自身網站和服務所需的基本 Cookie 和類似工具。我們使用效能 Cookie 收集匿名統計資料,以便了解客戶如何使用我們的網站並進行改進。基本 Cookie 無法停用,但可以按一下「自訂」或「拒絕」以拒絕效能 Cookie。

如果您同意,AWS 與經核准的第三方也會使用 Cookie 提供實用的網站功能、記住您的偏好設定,並顯示相關內容,包括相關廣告。若要接受或拒絕所有非必要 Cookie,請按一下「接受」或「拒絕」。若要進行更詳細的選擇,請按一下「自訂」。

在 中使用篩選條件取消訂閱 WebSocket 連線 AWS AppSync

焦點模式
在 中使用篩選條件取消訂閱 WebSocket 連線 AWS AppSync - AWS AppSync GraphQL

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

在 中 AWS AppSync,您可以根據特定的篩選邏輯,強制從連線的用戶端取消訂閱和關閉 (驗證) WebSocket 連線。這在授權相關案例中非常有用,例如當您從群組中移除使用者時。

訂閱失效是為了回應變動中定義的承載。我們建議您將用於使訂閱連線失效的變動視為 API 中的管理操作,並限制其對管理員使用者、群組或後端服務的使用,藉此相應地調整範圍許可。例如,使用結構描述授權指令,例如 @aws_auth(cognito_groups: ["Administrators"])@aws_iam。如需詳細資訊,請參閱使用其他授權模式

失效篩選條件使用與增強型訂閱篩選條件相同的語法和邏輯。使用以下公用程式定義這些篩選條件:

  • extensions.invalidateSubscriptions() – 在 GraphQL 解析程式的 回應處理常式中定義變動。

  • extensions.setSubscriptionInvalidationFilter() – 在 GraphQL 解析程式的回應處理常式中定義與變動連結的訂閱。

如需失效篩選延伸模組的詳細資訊,請參閱 JavaScript 解析程式概觀

使用訂閱失效

若要查看訂閱失效的運作方式 AWS AppSync,請使用下列 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 }

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

調用變動時,payload物件中定義的資料會用來取消訂閱 中定義的訂閱subscriptionField。失效篩選條件也會在onGroupMessageCreated訂閱的回應映射範本中定義。

如果extensions.invalidateSubscriptions()承載包含的 ID 符合篩選條件中定義的訂閱用戶端 IDs,則會取消訂閱對應的訂閱。此外,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 group-1使用下列訂閱請求,將 ID 為 的新使用者user-1訂閱至 ID 為 的群組:

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

AWS AppSync 會執行訂閱解析程式,產生訂閱和失效篩選條件,如上述onGroupMessageCreated回應映射範本所定義。對於用戶端 A,訂閱篩選條件僅允許將資料傳送至 group-1,並同時為 user-1和 定義失效篩選條件group-1

現在假設用戶端 B group-2使用以下訂閱請求,將 ID 為 的使用者訂閱user-2至 ID 為 的群組:

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

AWS AppSync 會執行訂閱解析程式,產生訂閱和失效篩選條件。對於用戶端 B,訂閱篩選條件僅允許將資料傳送至 group-2,並同時為 user-2和 定義失效篩選條件group-2

接著,假設使用如下範例中的變動請求message-1來建立新的群組訊息,其中包含 ID:

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

符合定義篩選條件的訂閱用戶端會自動透過 WebSockets 接收下列資料承載:

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

用戶端 A 會收到訊息,因為篩選條件符合定義的訂閱篩選條件。不過,用戶端 B 不會收到訊息,因為使用者不是 的一部分group-1。此外,請求不符合訂閱解析程式中定義的訂閱篩選條件。

最後,假設 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()承載設定的電子郵件地址是否符合從 中使用者的 JWT 字符擷取的電子郵件地址context.identity.claims.email,以啟動失效。

隱私權網站條款Cookie 偏好設定
© 2025, Amazon Web Services, Inc.或其附屬公司。保留所有權利。