使用websocket连接时,对用户进行身份验证的可能方法有哪些?

时间:2011-12-01 10:04:55

标签: python authentication chat websocket tornado

示例场景:通过websocket连接的基于Web的多用户聊天应用程序。如何确保(或保证)此应用程序中的每个连接都属于某个经过身份验证的用户,并且“无法”被假用户模仿或在连接期间进行干预。

顺便说一句,我在服务器端使用tornado websocket来实现基本的聊天室,并且已经为我的应用程序的非websocket部分进行了身份验证。

ps:假设经过身份验证的用户发布他想要的内容,当其他用户打开项目的列表页面时,自动将其他用户添加到websocket听众列表中我希望每个用户能够单独与该项目的买方聊天而不是聊天室的方式,但一对一的聊天

3 个答案:

答案 0 :(得分:17)

首先,你应该记住两件关于WebSockets的事情:(a)它是一个不断发展的标准;(b)它旨在与不信任的客户合作。

您应该始终使用WebSockets进行的最重要和最重要的事情是检查它们的来源。如果原点不匹配,显然您不想处理该客户端,因此请忽略其请求。此外,请确保您使用的是“wss”安全WebSocket协议,而不是“ws”不安全协议。这将确保您的邮件已加密。

这样做的问题是,这些信息可能会被欺骗。请参阅this blog post以快速演示此内容。

附加安全:

  • 尝试发送一个盐渍令牌,将其盐渍/散列并发回并在握手阶段进行验证。
  • 限制过于频繁发生的请求(就像IRC协议一样)。如果用户在一秒钟内提交了10行或更多行,请忽略该用户。
  • 快速进行垃圾邮件检查(有很多算法) - 坚持使用轻量级启发式算法,否则会给您的服务器带来负担。像“免费”或“伟哥”这样的词汇。为用户提供一个分数,表示他们是垃圾邮件或机器人的可能性。当它被破坏时,从服务器启动它们。

希望有所帮助!对不起,如果没有。这是我对StackOverflow的回答。 :P

答案 1 :(得分:1)

我非常确定websocket连接会发送任何已在应用程序的非websocket连接中建立的cookie。您应该能够在Django的会话存储中查询连接的cookie并确定该套接字所属的用户。

退房:https://docs.djangoproject.com/en/1.3/topics/http/sessions/#configuring-the-session-engine

答案 2 :(得分:-4)

这是websocket连接的全部目的。您通过握手协议对它们进行身份验证。有关详细信息,请参阅此处 http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-08