5

ここで説明されているように、同様のアーキテクチャを持つ Django アプリにリアルタイムの更新を追加しようとしています: http://lincolnloop.com/blog/2012/apr/23/ginger-tech-stack/。基本的に、更新は Redis を介して Django から Node.js に送信され、接続されたクライアントに Socket.io でプッシュされます。現在、接続されているすべてのクライアントにブロードキャストできますが、実際には、アクションに関係するクライアントにのみデータを送信する必要があります (たとえば、ユーザーがメッセージを投稿し、連絡先/サブスクライバーのみがこのメッセージを受信します)。したがって、誰が誰であるかを知るために、Node.js 側である種の認証が必要です。これはどのように達成できますか?

4

1 に答える 1

1

これまでのところ、socket.io/node.js で接続ユーザーの ID を取得するための私のソリューションは次のとおりです (より良いソリューションがある場合は、お気軽に投稿してください)。

Django 側:

  • Django にパッチを適用して、pickle オブジェクトの代わりに json を使用してセッション データを保存します。

        diff --git a/django/contrib/sessions/backends/base.py b/django/contrib/sessions/backends/base.py
    index 5a637e2..cb4db54 100644
    --- a/django/contrib/sessions/backends/base.py
    +++ b/django/contrib/sessions/backends/base.py
    @@ -2,9 +2,9 @@
     import time
     from datetime import datetime, timedelta
     try:
    -    import cPickle as pickle
    +    import json
     except ImportError:
    -    import pickle
    +    import simplejson as json
    
     from django.conf import settings
     from django.core.exceptions import SuspiciousOperation
    @@ -75,21 +75,21 @@ def _hash(self, value):
             return salted_hmac(key_salt, value).hexdigest()
    
         def encode(self, session_dict):
    -        "Returns the given session dictionary pickled and encoded as a string."
    -        pickled = pickle.dumps(session_dict, pickle.HIGHEST_PROTOCOL)
    -        hash = self._hash(pickled)
    -        return base64.encodestring(hash + ":" + pickled)
    +        "Returns the given session dictionary as json and encoded as a string."
    +        data = json.dumps(session_dict)
    +        hash = self._hash(data)
    +        return base64.encodestring(hash + ":" + data)
    
         def decode(self, session_data):
             encoded_data = base64.decodestring(session_data)
             try:
                 # could produce ValueError if there is no ':'
    -            hash, pickled = encoded_data.split(':', 1)
    -            expected_hash = self._hash(pickled)
    +            hash, data = encoded_data.split(':', 1)
    +            expected_hash = self._hash(data)
                 if not constant_time_compare(hash, expected_hash):
                     raise SuspiciousOperation("Session data corrupted")
                 else:
    -                return pickle.loads(pickled)
    +                return json.loads(data)
             except Exception:
                 # ValueError, SuspiciousOperation, unpickling exceptions. If any of
                 # these happen, just return an empty dictionary (an empty session).
    

Node.js 側:

  • 「sessionid」Cookie からセッション キーを読み取ります。

    socket.on('connection', function(client) {
        ...
        var cookie_string = client.handshake.headers.cookie;
        var parsed_cookies = connect.utils.parseCookie(cookie_string);
        var sessionid = parsed_cookies['sessionid'];
        ...
    });
    
  • セッション ID に対応するデータベースからセッション データを取得してデコードし、ユーザー ID を取得します。

于 2012-05-05T13:07:04.903 に答える