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