Pusher/PubNub 1000 个私人频道

Posted

技术标签:

【中文标题】Pusher/PubNub 1000 个私人频道【英文标题】:Pusher/PubNub 1000s of Private Channels 【发布时间】:2016-02-24 01:10:23 【问题描述】:

我有一个特定的用例,我需要将用户的帐户余额发送到他们的浏览器和/或移动设备。这些余额当然是私人的,但是当余额发生变化时,我需要将余额更新发送给每个连接的用户,但是,我担心会同时推出 1000 个私人频道。

对于这种用例,Pusher 和 PubNub 之间有什么限制吗?

编辑: 我特别关注https://pusher.com/docs/server_api_guide/interact_rest_api#example-publish-an-event-on-multiple-channels/lang=cs 并同时发布到多个频道。我是否可以在一个批次中发布到 100,000 个私人频道?

【问题讨论】:

【参考方案1】:

PubNub 发布限制和实时账户余额通知的安全性

每个频道每秒的发布次数没有硬性限制。 PubNub 保留更改此限制的权利。联系 support@pubnub.com 确认您的限制。

安全地发布实时账户余额

因此,您需要将实时帐户余额信息安全地发送给许多人。当您想传输一个人的实时账户余额时,您需要一份安全注意事项清单。由于您是从受信任的代码执行环境传输实时帐户余额,因此您不需要实施 PKI (公钥基础设施) 安全性。但是,您确实需要会话令牌安全授权、用户身份验证和双层加密。

    会话令牌安全:PubNub Access Manager 将提供允许基于会话的用户级访问管理的机制。

    用户身份验证:您需要通过电子邮件/密码对用户进行身份验证。成功验证后,您将使用grant() API 发出 Session Token 以供 PubNub Access Manager 使用。您还将生成将在第 3 项中使用的安全字符串(随机长且不可预测的密钥)。

    双层加密:除了 TLS,您还将使用 PubNub AES256 消息加密。您将在 SDK 初始化时提供 cipher_key。在上面的 2 项中,除了 令牌会话密钥 之外,您还需要生成 密码密钥 并将其发送给用户。 Cipher Key 和 Auth Key(令牌会话密钥)都应该是长的、随机的和不可预测的。

Session Token Key (Auth Key)Cipher Key 的好例子:

cHRiSEZPVkdnd1RqTktNVnB0YkdWS1UxSlRVbXNVMUpyV201U05XUlhSak

注意:uuid(用户的 id) 应被视为与密码密钥和会话令牌相同的长且不可预测的。

接收实时更新的用户初始化示例

现在您可以使用以下 javascript 示例安全连接到 PubNub。

<!-- User Initialization Example -->
<script src="https://cdn.pubnub.com/pubnub-3.7.17.min.js"></script>
<script>(function()

    // Init User Connection
    var pubnub = PUBNUB(
    ,   subscribe_key : 'sub-c-your-subscribe-key-here'
    ,   auth_key      : 'user-session-token-here'
    ,   cipher_key    : 'user-cipher-key-here'
    ,   uuid          : 'user-id-here'
    ,   ssl           : true
    );

    // Subscribe to a Private User Channel
    pubnub.subscribe(
        channel : 'user-private-channel-here'
    ,   message : function(message)  console.log(message) 
    );

)()</script>

发送实时更新的服务器初始化示例

现在,对于受信任执行环境中的服务器代码,您可以向最终用户客户端发布消息。

// Server Initialization Example
var pubnub = PUBNUB(
    publish_key   : 'pub-c-your-publish-key-here'
,   subscribe_key : 'sub-c-your-subscribe-key-here'
,   secret_key    : 'sec-c-your-secret-key-here'
,   auth_key      : 'server-admin-session-token-here'
,   cipher_key    : 'destination-user-cipher-key-here'
,   uuid          : 'server-id-here'
,   ssl           : true
);

// Send Realtime Balance when User's Balance Changes
pubnub.publish(
    channel : 'destination-user-private-channel-here'
,   message :  "balance" : 10.00 
);

注意:您必须预先授予对用户auth_key 的访问权限,然后他们才能在客户端设备上订阅其用户频道。服务器必须使用grant API 进行授权。

// Send Realtime Balance when User's Balance Changes
pubnub.grant(
    channel  : 'destination-user-private-channel-here'
,   auth_key : 'user-session-token-here'
,   ttl      : 1440   // minutes of session time to live
,   read     : true   // user can read-only
,   write    : false  // user can't write
);

遵循上述这些准则将使您能够提供现代安全性,以便向最终用户提供敏感信息。请注意,我们没有涵盖从不受信任的代码执行环境发布时需要的 PKI Public Key Infrastructure。但是,根据您的需要,您将不需要 PKI,因为您是从服务器的受信任代码发布的。

【讨论】:

这是每秒发布数,但是如果我需要同时在 100 万个频道上发布一两条消息怎么办? 嗨@Ryan 是的好问题。您可以每个频道每秒发布一百万条消息。我用澄清更新了我的答案。 也许我应该更具体一些。将一条消息发布到 100 万个私人频道时,是否有任何 API 调用限制?例如。我可以将 100 万个私有通道传递到 REST API 端点吗?我想我需要分块? 啊!我明白你的意思了。 PubNub 提供Stream Controller 服务。为此,您将使用 PubNub Channel Groups。此外,您真的应该考虑 PubNub 的广播能力。您可以通过 1 次 API 调用向无限数量的订阅者广播 1 条消息。 是的,但我无法将某人的实时帐户余额广播给一组用户 :) 这就是为什么我需要将余额信息安全地发送给许多用户

以上是关于Pusher/PubNub 1000 个私人频道的主要内容,如果未能解决你的问题,请参考以下文章

公共频道更改为私人频道时无法获取 Slack 频道信息

我如何“检查”频道是不是为私人频道?

Discord API / Restcord : 创建私人频道

Slackbot 可以从私人频道中提取消息并在另一个 Slack 频道中发布吗?

如何使用 Telethon 获取电报私人频道 ID

Zapier Slack 私人频道:仅当用户在频道中时才发送消息