Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Di AWS AppSync, Anda dapat berhenti berlangganan secara paksa dan menutup (membatalkan) WebSocket koneksi dari klien yang terhubung berdasarkan logika penyaringan tertentu. Ini berguna dalam skenario terkait otorisasi seperti ketika Anda menghapus pengguna dari grup.
Pembatalan langganan terjadi sebagai respons terhadap muatan yang ditentukan dalam mutasi. Sebaiknya Anda memperlakukan mutasi yang digunakan untuk membatalkan koneksi langganan sebagai operasi administratif di API dan izin cakupan sesuai dengan membatasi penggunaannya pada pengguna admin, grup, atau layanan backend. Misalnya, menggunakan arahan otorisasi skema seperti atau. @aws_auth(cognito_groups:
["Administrators"])
@aws_iam
Untuk informasi selengkapnya, lihat Menggunakan mode otorisasi tambahan.
Filter pembatalan menggunakan sintaks dan logika yang sama dengan filter langganan yang disempurnakan. Tentukan filter ini menggunakan utilitas berikut:
-
extensions.invalidateSubscriptions()
— Didefinisikan dalam penangan respons GraphQL resolver untuk mutasi. -
extensions.setSubscriptionInvalidationFilter()
— Didefinisikan dalam penangan respons GraphQL resolver dari langganan yang ditautkan ke mutasi.
Menggunakan pembatalan langganan
Untuk melihat cara kerja pembatalan langganan AWS AppSync, gunakan skema GraphQL berikut:
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
}
Tentukan filter pembatalan dalam kode penyelesai removeUserFromGroup
mutasi:
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 };
}
Saat mutasi dipanggil, data yang ditentukan dalam payload
objek digunakan untuk berhenti berlangganan langganan yang ditentukan. subscriptionField
Filter pembatalan juga didefinisikan dalam template pemetaan respons onGroupMessageCreated
langganan.
Jika extensions.invalidateSubscriptions()
payload berisi ID yang cocok dengan klien berlangganan seperti yang didefinisikan dalam filter, langganan terkait akan berhenti berlangganan. IDs Selain itu, WebSocket koneksi ditutup. Tentukan kode resolver langganan untuk langganan: 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;
}
Perhatikan bahwa handler respons langganan dapat memiliki filter langganan dan filter pembatalan yang ditentukan secara bersamaan.
Misalnya, asumsikan bahwa klien A berlangganan pengguna baru dengan ID
ke grup dengan ID user-1
menggunakan permintaan berlangganan berikut:group-1
onGroupMessageCreated(userId : "user-1
", groupId: :"group-1
"){...}
AWS AppSync menjalankan resolver langganan, yang menghasilkan filter langganan dan pembatalan seperti yang didefinisikan dalam template pemetaan respons sebelumnyaonGroupMessageCreated
. Untuk klien A, filter langganan memungkinkan data dikirim hanya ke
, dan filter pembatalan ditentukan untuk keduanya group-1
dan. user-1
group-1
Sekarang asumsikan bahwa klien B berlangganan pengguna dengan ID
ke grup dengan ID user-2
menggunakan permintaan berlangganan berikut:group-2
onGroupMessageCreated(userId : "user-2
", groupId: :"group-2
"){...}
AWS AppSync menjalankan resolver langganan, yang menghasilkan filter langganan dan pembatalan. Untuk klien B, filter langganan memungkinkan data dikirim hanya ke
, dan filter pembatalan ditentukan untuk keduanya group-2
dan. user-2
group-2
Selanjutnya, asumsikan bahwa pesan grup baru dengan ID
dibuat menggunakan permintaan mutasi seperti pada contoh berikut:message-1
createGroupMessage(id: "message-1
", groupId :
"group-1
", message: "test message"){...}
Klien berlangganan yang cocok dengan filter yang ditentukan secara otomatis menerima muatan data berikut melalui: WebSockets
{
"data": {
"onGroupMessageCreated": {
"id": "message-1",
"groupId": "group-1",
"message": "test message",
}
}
}
Klien A menerima pesan karena kriteria pemfilteran cocok dengan filter langganan yang ditentukan. Namun, klien B tidak menerima pesan, karena pengguna bukan bagian dari
. Selain itu, permintaan tidak cocok dengan filter langganan yang ditentukan dalam resolver langganan.group-1
Akhirnya, asumsikan
bahwa dihapus dari user-1
menggunakan permintaan mutasi berikut:group-1
removeUserFromGroup(userId: "user-1", groupId : "group-1"){...}
Mutasi memulai pembatalan langganan seperti yang didefinisikan dalam kode penangan respons extensions.invalidateSubscriptions()
resolvernya. AWS AppSync kemudian berhenti berlangganan klien A dan menutup koneksinya. WebSocket Klien B tidak terpengaruh, karena payload pembatalan yang ditentukan dalam mutasi tidak cocok dengan pengguna atau grupnya.
Ketika AWS AppSync membatalkan koneksi, klien menerima pesan yang mengonfirmasi bahwa mereka berhenti berlangganan:
{
"message": "Subscription complete."
}
Menggunakan variabel konteks dalam filter pembatalan langganan
Seperti halnya filter langganan yang disempurnakan, Anda dapat menggunakan context
variabel dalam ekstensi filter pembatalan langganan untuk mengakses data tertentu.
Misalnya, Anda dapat mengonfigurasi alamat email sebagai payload pembatalan dalam mutasi, lalu mencocokkannya dengan atribut email atau klaim dari pengguna berlangganan yang diotorisasi dengan kumpulan pengguna Amazon Cognito atau OpenID Connect. Filter pembatalan yang ditentukan dalam invalidator extensions.setSubscriptionInvalidationFilter()
langganan memeriksa apakah alamat email yang ditetapkan oleh extensions.invalidateSubscriptions()
muatan mutasi cocok dengan alamat email yang diambil dari token JWT pengguna, memulai pembatalan. context.identity.claims.email