【发布时间】:2015-02-12 08:34:18
【问题描述】:
我有一个应用程序,每个用户都必须收到仅与他们自己相关的通知。
为此,我为每个用户创建了一个唯一的频道名称。当用户使用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 意味着除了频道名称之外,我还必须存储一个身份验证密钥,并授权该密钥读取频道。
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 的通知。我不知道我的通知接收者是实际登录还是只是复制了密钥。
我的想法是否正确,为了防止这种可能性,我应该简单地定期重新生成频道名称或身份验证密钥,例如当用户注销时或每天?
【问题讨论】:
-
嗨,好奇的观察者!我有一个快速提示:您必须像对待会话 ID 一样对待您的
auth_key(这就是 Facebook、Gmail 和 Twitter 的工作方式)。我会在下面写一些更多的细节。 -
首先确保发出 REST 调用,而不是将密钥添加到页面的源代码中。这更安全,让您在安全方面更加灵活。
标签: pubnub