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 个私人频道的主要内容,如果未能解决你的问题,请参考以下文章
Discord API / Restcord : 创建私人频道