安全的Pubnub订户密钥和通道名称

Cur*_*ver 6 pubnub

我有一个应用程序,每个用户必须接收仅与他们自己相关的通知.

为此,我为每个用户创建了一个唯一的频道名称.当用户使用javascript从浏览器登录时,我订阅了此频道.

pubnub = PUBNUB.init({
   subscribe_key : '<subscriber-key>'
});

pubnub.subscribe({
  channel: "<unique-channel-name>",
})
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果有人获得用户唯一频道的名称,他们可以设置自己的pubnub客户端并在没有任何授权的情况下接收通知吗?基本上,保护用户数据的一切都是在页面源代码中公开提供的频道名称和订阅者密钥.我查看了pubnub的访问管理器,但它遇到了同样的问题,不是吗?如果有人打开源代码并复制auth-key,他们可以设置自己的客户端并接收消息吗?

编辑:其他信息

我为每个用户注册时生成并保存了一个频道名称.此名称是随机UUID,如"7304cd62-9ba2-4842-98d8-8a5c8e561275".当我想通知用户时,他们说,他们有朋友请求,我从数据库中提取频道名称并发布通知.每当他们登录时,呈现的页面都使用Ruby将他们的频道名称和我的订阅者密钥注入一个隐藏字段,javascript用它来初始化pubnub.

<%= my_pubnub_subscriber_key %>
<%= current_user.channel.name %>
Run Code Online (Sandbox Code Playgroud)

在这种情况下,使用Access Manager意味着除了频道名称之外我还必须存储一个auth密钥,并授权密钥读取频道.

John
- john-channel
- john-key-authorizing-read-on-john-channel

Jane
- jane-channel
- jane-key-authorizing-read-on-jane-channel
Run Code Online (Sandbox Code Playgroud)

然后,渲染页面将有三个字段来初始化pubnub:

<%= my_pubnub_subscriber_key %>
<%= john-channel %>
<%= john-key %>
Run Code Online (Sandbox Code Playgroud)

最初的问题仍然存在.如果Jane去John的家,打开John主页的源代码,复制3个键,回家并创建自己的客户端,她可以订阅John的通知.我不知道我的通知的接收者是否实际登录或只是复制了密钥.

我的想法是正确的,为了防止这种可能性,我应该只是定期重新生成频道名称或授权密钥,例如当用户退出或每天?

Ste*_*lum 5

使用ACL /访问管理保护PubNub上的数据流

您也想保护PubNub订阅者密钥和频道名称.通过每个连接级别的细粒度读写访问控制,您可以为用户,设备和通道提供授权和访问控制.

好的部分 - 使用PubNub访问管理和ACL,您可以 阻止某人设置自己的PubNub客户端并在没有任何授权的情况下接收通知.

这是通过PubNub完成的,PubNub auth_key是由服务器管理的经过身份验证的访问令牌.基本上,您希望 在PubNub数据流上为有价值的数据缓解和阻止订阅共享.

保持秘密和安全 - 实时数据流的访问控制

您必须像对待auth_key用户的秘密一样对待您的PubNub .这类似于允许访问数据流的会话密钥/ 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');
}
Run Code Online (Sandbox Code Playgroud)

撤消对恶意活动的访问权限

如果用户登录两次或打开多个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) }
});
Run Code Online (Sandbox Code Playgroud)

安全的PubNub订户密钥和通道名称

通过使用ACL /访问管理在PubNub上保护数据流来保护PubNub订户密钥和通道名称

此外,如果您使用Node.JS进行访问管理控制,我们为您提供了一个有趣的社区论坛帖子,它使用带有Node.JS的PubNub Access Manager以合理的速度描述批量授权,既有好又有用.