私はこれが少し古いと知っていますが、将来の読者は、クッキーを解析してストレージからセッションを取得するアプローチ(例:passport.socketio)に加えて、トークンベースのアプローチを検討することもできます。
この例では、かなり標準的なJSON Webトークンを使用しています。あなたは、クライアントのページにトークンを与える。この例ではJWTを返す認証エンドポイントを想像する必要があります。
今
var jwt = require('jsonwebtoken');
// other requires
app.post('/login', function (req, res) {
// TODO: validate the actual user user
var profile = {
first_name: 'John',
last_name: 'Doe',
email: '[email protected]',
id: 123
};
// we are sending the profile in the token
var token = jwt.sign(profile, jwtSecret, { expiresInMinutes: 60*5 });
res.json({token: token});
});
次のように、あなたのsocket.ioサーバを設定することができます。
var socketioJwt = require('socketio-jwt');
var sio = socketIo.listen(server);
sio.set('authorization', socketioJwt.authorize({
secret: jwtSecret,
handshake: true
}));
sio.sockets
.on('connection', function (socket) {
console.log(socket.handshake.decoded_token.email, 'has joined');
//socket.on('event');
});
あなたが唯一の接続時に、それを添付する必要があり、クライアントからのようsocket.io-JWTミドルウェアは、クエリ文字列にトークンを期待:
var socket = io.connect('', {
query: 'token=' + token
});
私はこのメタについてのより詳しい説明を書きましたodおよびクッキーhere。
Socket.IOをスタンドアロンとして使用していますか?オーセンティケータはクッキーを作成せず、単にSocket.IOに渡します。 – hexacyanide
@hexacyanide私はsocket.ioでexpressを使っています。 Expressは認証クッキーを作成するだけです。私はルーティング、ミドルウェア、それを使用しないでください.... expressとsocket.ioの間のセッションは、connect-redisと共有されます。私はそれがクッキーに署名するためにのみ表現を使用するあまりにも大きな依存性の方法だと思う。だから私はエクスプレス(接続)に依存しないソリューションを探しています。私は自分のテストされていない、安全でない認証手続きを実装することができましたが、Golo Rodenのように、それはお勧めできません。 – bekite
つまり、基本HTTPサーバーで実行される実装を希望しますか? HTTPサーバーを完全に使用したくない場合は、Cookieを使用しますか? – hexacyanide