は(あなたがよりよい解決策を持っている場合は、投稿して自由に感じる)socket.io/node.jsに接続されているユーザーのIDを取得するには、これまで私のソリューションです。
パッチジャンゴストアセッションデータに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の側では
:
"セッションID" クッキーからセッション鍵を読む:
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に対応するDBからセッションデータをデコード&を取得ユーザーIDを取得します。ジャンゴとノードを想定すると、
は同じホスト名であり、そしてあなたは、Djangoの中にクッキーベースの認証を有し、したがって、ノードは、それらのCookieを読み取ることができ、あなたはノードのために、Djangoの認証用のアダプタを書くことができます。 –
私はデータベースベースのセッションからクッキーベースのセッションに移行し、ノード側で«セッションID»クッキーを読むことができます。だから、私は[この機能](https://github.com/django/django/blob/master/django/core/signing.py#L134)をノードに移植する必要があると思います... – djevg
申し訳ありません - 私はいませんでしたあなたがNodeから同じデータベースにアクセスできるのであれば、dbでバックアップされたセッションを使うことができるはずです。セッションIDのためにクッキーを使うことを意味していました。どちらの解決策もうまくいくはずです。ええ、[ノードの暗号モジュール](http://nodejs.org/api/crypto.html)があなたの友人になります。 –