4

一旦使用 django-socketio 通过 Socket.IO 连接从客户端 (JS) 到服务器 (django/python) 发送消息,是否可以确定在呈现页面时哪个用户通过了身份验证?

在这种情况下,视图由 django 提供,它需要身份验证——通常在我能够做到的服务器上user = request.user,但在events.py文件中request.user只返回一个AnonymousUser对象。这是有道理的,因为 websocket 服务器是一个与 django web 服务器完全不同的进程,因此用户没有在该套接字连接上进行身份验证。

我在想我必须想出一些巧妙的代码来将用户 ID 嵌入到发送到服务器的消息中,在这种情况下,我需要添加一些握手以确保最终用户无法欺骗它。

有没有人想出一个聪明的解决方案来解决这个问题?

4

2 回答 2

4

找到了我自己解决这个问题的方法。诀窍是在将session_keydjangorequest对象发送到服务器之前将其添加到 django-socketio 消息中;然后回到服务器端,您可以将其解析session_key为 User 对象。这是代码:

模板文件:(由 django 服务器提供)

<input type="hidden" id="session_key" value="{{ request.session.session_key }}">
...
<script type="text/javascript" charset="utf-8">
    function someHandler(action, post_id, some_val){
        var data = {
            'action': action,
            'post_id': post_id,
            'value': some_val,
            'session_key': $("#session_key").val()
        };
        socket.send(data);
    }
</script>

events.py:(由 django-socketio 服务器处理)

from django.contrib.sessions.models import Session
from django.contrib.auth.models import User

def message(request, socket, context, message):
    session = Session.objects.get(session_key=message['session_key'])
    uid = session.get_decoded().get('_auth_user_id')
    user = User.objects.get(pk=uid)

利润!

于 2012-12-12T19:43:58.327 回答
0

为了避免 skandocious 在答案中出现额外的数据库命中,可以使用Django 的缓存会话。这涉及设置memcached和修改SESSION_ENGINE设置以使用您选择的缓存后端。

于 2015-09-07T08:28:25.240 回答