我有一个应用程序,每个用户必须收到仅与他们自己相关的通知。
为此,我为每个用户创建了一个唯一的频道名称。当用户使用javascript从浏览器登录时,我订阅了此频道。
pubnub = PUBNUB.init({
subscribe_key : '<subscriber-key>'
});
pubnub.subscribe({
channel: "<unique-channel-name>",
})
我的问题是,如果有人获得用户唯一频道的名称,他们可以设置自己的pubnub客户端并在没有任何授权的情况下接收通知吗?基本上,保护用户数据的一切都是在页面的源代码中公开提供的频道名称和订阅者密钥。我查看了pubnub的访问管理器,但它遇到了同样的问题,不是吗?如果有人打开源代码并复制auth-key,他们可以设置自己的客户端并接收消息吗?
我为每个用户注册时生成并保存了一个频道名称。此名称是随机UUID,如“7304cd62-9ba2-4842-98d8-8a5c8e561275”。当我想通知用户时,他们说,他们有朋友请求,我从数据库中提取频道名称并发布通知。每当他们登录时,渲染的页面使用Ruby将他们的频道名称和我的订阅者密钥注入一个隐藏字段,javascript用它来初始化pubnub。
<%= my_pubnub_subscriber_key %>
<%= current_user.channel.name %>
在这种情况下,使用Access Manager意味着除了频道名称之外我还必须存储一个auth密钥,并授权密钥读取频道。
John
- john-channel
- john-key-authorizing-read-on-john-channel
Jane
- jane-channel
- jane-key-authorizing-read-on-jane-channel
渲染页面将有三个字段来初始化pubnub:
<%= my_pubnub_subscriber_key %>
<%= john-channel %>
<%= john-key %>
最初的问题仍然存在。如果Jane去John的家,打开John主页的源代码,复制3个键,回家并创建自己的客户端,她可以订阅John的通知。我不知道我的通知的接收者是否实际登录或只是复制了密钥。
我的想法是正确的,为了防止这种可能性,我应该定期重新生成频道名称或身份验证密钥,例如当用户退出或每天?
答案 0 :(得分:5)
您也希望保护PubNub订阅者密钥和频道名称。 在每个连接级别上使用细粒度读写访问控制 可以为用户,设备和渠道提供授权和访问控制。
好的部分 - 使用PubNub访问管理和ACL,您可以 阻止某人设置自己的PubNub客户端 并在未经任何授权的情况下收到通知。
这是通过PubNub auth_key
完成的,这是一个经过身份验证的访问令牌
由您的服务器管理。基本上你想要
{/ 3}}获取有关PubNub数据流的宝贵数据。
您必须像对待秘密一样对待您的PubNub auth_key
仅供用户使用。
这类似于允许访问数据流的会话密钥/ ID,
类似于Netflix,Spotify,Facebook和Gmail的方式
提供安全的访问层。
这就是您的JavaScript应该是安全访问控制的样子。
Wohhhh注意 - JavaScript文件中没有存储访问密钥。
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Get User Access Keys from Your Server
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
console.log('getting user login information');
get_user_access( 'https://myservers.com/user/login/', function(user) {
var pubnub = PUBNUB({
subscribe_key : user.subscribe_key,
auth_key : user.auth_key
});
ready( pubnub, user );
} );
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Data Stream Connection Ready to Start
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
function ready( pubnub, user ) {
console.log('ready to subscribe to data stream channel');
pubnub.subscribe({
channel : user.channels,
message : receiver
});
}
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Data Stream Payloads Received
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
function receiver(data) {
console.log('received secure data payload');
}
如果用户登录两次或打开多个PubNub,该怎么办?
数据流连接?
如果您检测到滥用行为,则可以立即撤消访问权限
pubnub.revoke()
命令。
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Revoke Access from Your Server
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
pubnub.revoke({
channel : 'CHANNEL_NAME',
auth_key : 'BAD_APPLE_AUTH_KEY',
callback : function(m){console.log(m) }
});
安全PubNub订阅者密钥和频道名称 使用ACL /访问管理保护PubNub上的数据流
此外,如果您使用Node.JS进行访问管理控制,我们会为您提供一个有趣的社区论坛帖子,使用Mitigate and Prevent Subscription Sharing以合理的速度描述批量授予真棒。