gpt4 book ai didi

node.js - 如何在 socket.io 上访问 session 数据( Node 客户端 session )?

转载 作者:搜寻专家 更新时间:2023-10-31 23:43:23 25 4
gpt4 key购买 nike

我的应用程序中的 session 数据是用 node-client-sessions 处理的(如 Using secure client-side sessions to build simple and scalable Node.JS applications 中所建议)现在我有 socket.io (websockets) 来处理一些实时功能。我想通过握手时的 session 数据对登录用户进行身份验证。但是 socket.io 在握手时给了我们这个 handshakeData对象,它不会完全公开请求对象。我需要访问请求的 session 属性。有什么想法吗?

我正在使用 expressjs ( Node )。

更新

受@LaurentPerrin 的回答启发,我深入研究了客户端 session 源代码并发现了公开的解码和编码函数。也许不像直接弄乱我的 session 对象那么容易,但到目前为止非常有效。

我的代码,到目前为止:

/*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 认为发生错误:

警告 - 握手错误 [object Object]

所以在第二个时刻,我在未授权时将 null 作为第一个参数传递:

信息 - 未经授权的握手

考虑到 socket.io 理解每一件事的方式,第二种方式在语义上似乎更正确。 =)

我选择第二种方式。自己选一个。

最佳答案

不确定它是否完全相同,但我在我的案例中写了这个。请注意,我直接在 express dependencies 中要求以避免版本问题。

var cookie = require('express/node_modules/cookie'),
parseSignedCookie = require('express/node_modules/connect').utils.parseSignedCookie,
parseJSONCookie = require('express/node_modules/connect').utils.parseJSONCookie;



io.set('authorization', authorizeSocket);



function authorizeSocket(handshake, done) {
if (!handshake.headers.cookie)
return done({status: 'forbidden', reason: 'no session', source: 'socket_io'}, false);

var cookies = cookie.parse(handshake.headers.cookie),
signed = cookies['your_session_cookie'];

if (!signed)
return done({status: 'forbidden', reason: 'tampered cookie', source: 'socket_io'}, false);

var raw = parseSignedCookie(signed, 'your_session_secret'),
json = parseJSONCookie(raw);

if (!json || !json.passport || !json.passport.user)
return done({status: 'forbidden', reason: 'bad session', source: 'socket_io'}, false);

// finally...
var user = json.passport.user;

handshake.user = user;

done(null, true);
}

关于node.js - 如何在 socket.io 上访问 session 数据( Node 客户端 session )?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18475543/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com