根据UUID退订用户

Unsubscribe users based on UUID

我是 PubNub 的初学者,我的问题是当多个用户订阅了一个频道时,我可以根据 uuid 从服务器端取消订阅其中一个用户吗?如果没有,你能帮我做一下吗?

我的项目依赖于多个用户订阅一个频道,服务器端订阅存在频道并监听所有状态,我需要服务器端随时取消订阅任何用户?

PubNub 远程控制客户端退订

有几种方法可以实现这一点。一个提供向客户端发送取消订阅信号的能力,另一个允许完全服务器端控制。使用 聊天室 示例,我将描述如何完成此操作。所有链接到 PubNub docs are to the Node SDK but you can check the docs for any other SDK 根据需要。

客户端退订

您可以使用信号消息使客户端自动执行操作。

首先,您应该让每个客户都订阅一个客户独有的频道。频道名称可以包含用户的 UUID,例如 ch-1234-5678-9ABC。只要您有办法将客户端映射到该通道,您选择的任何命名约定就足够了。

当您的服务器确定客户端应取消订阅某个频道时,您可以在该客户端的专用频道上发送 命令信号 以执行该操作。消息可能是这样的:

{'command':'leave', 'channel':'chat-abc'}

当客户端收到这样的消息时,您的客户端逻辑将在通道 chat-abc 上执行 unsubscribe。不需要最终用户(人)采取任何行动。 远程控制取消订阅,或者您需要让客户端执行的任何操作。

您可以很容易地在您希望客户取消订阅的频道上发送 命令信号 ,但随后所有订阅该频道的客户都会收到消息,并且您的客户端代码必须过滤 UUID。不完全是最有效的方式,但绝对是另一种选择。如果您需要取消订阅频道上的许多或所有客户端,则很有用。您可以传递一个 UUID 列表,每个客户端只检查它们的 UUID 是否在列表中,如果在,则执行操作。您的消息负载可能如下所示:

{'command':'leave', 'uuids':['1234-5678-9ABC','DEFG-HIJK-LMNO','9876-5432-1ZYX']}

无需指定频道,因为它将应用于您的服务器发布消息的频道。

从频道组中删除频道

上面的方法可以工作并且非常简单,但需要在服务器和客户端上编写代码才能使其全部工作。使用 Channel Groups,除了最初订阅相关频道组之外,服务器无需客户端参与即可享受所有乐趣。

每个客户都将订阅他们自己的频道组(就像上面的私人频道一样),而不是直接订阅频道。让我们调用频道组 cg-1234-5678-9ABC。同样,我们想要一种将频道组映射到特定用户的方法,因此我们使用 UUID 作为名称的一部分。

对于每个需要加入聊天室的客户,聊天室和以前一样在 chat-abc 上,this channel will be added to each users' private channel group。从服务器执行此操作具有使客户端订阅该频道以及您添加到这些频道组的任何其他频道的效果。

当您的服务器确定用户需要取消订阅某个频道时,它可以简单地 remove that channel from that user's private channel group。仅此而已。

使用访问管理器的安全控制

以上所有这些都很酷,但不是很安全。因为如果 好奇的用户 想要,他们可以编写一些代码来订阅频道(任何频道或频道组)或将频道添加到他们的频道组甚至发布到任何频道他们想收听的频道(即使是没人收听的频道)。

为了防止这种情况,您需要 Access Manager 并让您的服务器授予 read 客户端需要订阅的频道或频道组的权限,以及 write 权限客户端需要发布到的频道。

对于频道组,您的客户只需要 read 访问频道组。添加到这些频道组的所有频道都将继承 read 权限,但不会继承任何 write 发布权限 - 必须为每个用户每个频道授予。

您的服务器必须拥有频道组的 manage 权限,它需要向频道组添加频道和从中删除频道(当每个频道组需要该权限时,它可以授予自己)。当客户端被迫离开频道时(无论您从上面选择哪种方式:频道取消订阅或频道组删除频道),您还将删除该用户的授权密钥的 readwrite 权限.

我故意省略了 Access Manager 授予和撤销的细节,因为它在我们的文档或其他 SO 线程和 PubNub 博客中有充分的介绍。但如果您需要有关 Access Manager 实施的更多帮助,请联系 PubNub Support