我的应用程序中的会话数据由node-client-sessions处理(如使用安全客户端会话构建简单且可扩展的 Node.JS 应用程序中所建议的那样),现在我有socket.io (websockets) 来处理一些实时功能. 我想通过握手时的会话数据对登录用户进行身份验证。但是 socket.io 在握手时给了我们这个handshakeData
对象,它并没有完全暴露请求对象。我需要访问请求的会话属性。有任何想法吗?
我正在使用expressjs (nodejs)。
更新
受到@LaurentPerrin 的启发,我深入研究了客户端会话源代码,发现了暴露的解码和编码功能。也许不像直接弄乱我的会话对象那么容易,但到目前为止非常有效。
我的代码,到目前为止:
/*jslint node: true, es5: true, nomen: true, unparam: true */
'use strict';
var encode = require('client-sessions').util.encode,
decode = require('client-sessions').util.decode,
cookie = require('cookie'),
cookieSettings = require('./persistors/cookieSettings'),
authorized = {
'me@domain.com': 1
};
module.exports = function websocket(io) {
io.set('authorization', function (handshakeData, callback) {
var session_data;
if (!handshakeData.headers.cookie) {
callback({
status: 'forbidden',
reason: 'no session',
source: 'socket_io'
}, false);
return;
}
session_data = decode(cookieSettings, cookie.parse(handshakeData.headers.cookie).session).content;
if (authorized[session_data.email]) {
handshakeData.session_data = session_data;
callback(null, true);
} else {
// callback({
// status: 'forbidden',
// reason: 'unauthorized',
// source: 'socket_io'
// }, false);
callback(null, false);
}
return;
});
io.set('transports', ['websocket', 'flashsocket']);
io.sockets.on('connection', function (socket) {
console.log('connected')
socket.on('credenciamento', function (data) {
console.log(socket.handshake.session_data.email);
socket.broadcast.emit('credenciamento', {
inscrito_id: data.inscrito_id
});
});
});
};
它绝不是完整的。但是授权部分似乎工作得很好。=)
现在,关于回调函数。起初我像@LaurentPerrin 一样使用它,传递一个带有错误响应的对象。但它会产生警告。Socket.io 认为发生了错误:
warn - handshake error [object Object]
所以在第二个时刻,我null
在未授权时作为第一个参数传递:
info - handshake unauthorized
考虑到 socket.io 理解每一件事的方式,第二种方式在语义上似乎更正确。=)
我选择第二种方式。自己挑一个。