sko*_*zan 21 session websocket node.js express
我正在尝试基于Node.js创建一个聊天应用程序.我想强制websocket服务器(ws库)使用ExpressJS会话系统.不幸的是,我卡住了.用于获取会话数据的MemoryStore哈希值与cookie中的会话ID不同.有人可以解释一下我做错了什么吗?
Websocket服务器代码部分:
module.exports = function(server, clients, express, store) {
server.on('connection', function(websocket) {
var username;
function broadcast(msg, from) {...}
function handleMessage(msg) {...}
express.cookieParser()(websocket.upgradeReq, null, function(err) {
var sessionID = websocket.upgradeReq.cookies['sid'];
//I see same value in Firebug
console.log(sessionID);
//Shows all hashes in store
//They're shorter than sessionID! Why?
for(var i in store.sessions)
console.log(i);
store.get(sessionID, function(err, session) {
websocket.on('message', handleMessage);
//other code - won't be executed until sessionID in store
websocket.on('close', function() {...});
});
});
});
}
Run Code Online (Sandbox Code Playgroud)
商店对象定义:
var store = new express.session.MemoryStore({
reapInterval: 60000 * 10
});
Run Code Online (Sandbox Code Playgroud)
应用配置:
app.configure(function() {
app.use(express.static(app.get("staticPath")));
app.use(express.bodyParser());
app.use(express.cookieParser());
app.use(express.session({
store: store,
secret: "dO_ob",
key: "sid"
}));
});
Run Code Online (Sandbox Code Playgroud)
部分主要代码:
var app = express();
var httpServer = http.createServer(app);
var websocketServer = new websocket.Server({server: httpServer});
httpServer.listen(80);
Run Code Online (Sandbox Code Playgroud)
示例调试输出:
- websocket.upgradeReq.headers.cookie "sid=s%3A64a%2F6DZ4Mab8H5Q9MTKujmcw.U8PJJIR%2BOgONY57mZ1KtSPx6XSfcn%2FQPZ%2FfkGwELkmM"
- websocket.upgradeReq.cookies["sid"] "s:64a/6DZ4Mab8H5Q9MTKujmcw.U8PJJIR+OgONY57mZ1KtSPx6XSfcn/QPZ/fkGwELkmM"
- i "64a/6DZ4Mab8H5Q9MTKujmcw"
Run Code Online (Sandbox Code Playgroud)
Ste*_*eve 16
我能够让这个工作.我认为您需要在cookieParser上指定秘密而不是会话存储.
我的应用示例:
var app = express();
var RedisStore = require('connect-redis')(express);
var sessionStore = new RedisStore();
var cookieParser = express.cookieParser('some secret');
app.use(cookieParser);
app.use(express.session({store: sessionStore}));
wss.on('connection', function(rawSocket) {
cookieParser(rawSocket.upgradeReq, null, function(err) {
var sessionID = rawSocket.upgradeReq.signedCookies['connect.sid'];
sessionStore.get(sessionID, function(err, sess) {
console.log(sess);
});
});
});
Run Code Online (Sandbox Code Playgroud)
Azm*_*sov 16
我发现这对我有用.不确定这是最好的方法来做到这一点.首先,初始化您的快递申请:
// whatever your express app is using here...
var session = require("express-session");
var sessionParser = session({
store: session_store,
cookie: {secure: true, maxAge: null, httpOnly: true}
});
app.use(sessionParser);
Run Code Online (Sandbox Code Playgroud)
现在,从WS连接显式调用会话中间件.如果您正在使用该express-session模块,则中间件将自行解析cookie.否则,您可能需要先通过cookie解析中间件发送它.
如果您正在使用该websocket模块:
ws.on("request", function(req){
sessionParser(req.httpRequest, {}, function(){
console.log(req.httpRequest.session);
// do stuff with the session here
});
});
Run Code Online (Sandbox Code Playgroud)
如果您正在使用该ws模块:
ws.on("connection", function(req){
sessionParser(req.upgradeReq, {}, function(){
console.log(req.upgradeReq.session);
// do stuff with the session here
});
});
Run Code Online (Sandbox Code Playgroud)
为方便起见,这里是一个完全工作的例子,使用express,express-session以及ws:
var app = require('express')();
var server = require("http").createServer(app);
var sessionParser = require('express-session')({
secret:"secret",
resave: true,
saveUninitialized: true
});
app.use(sessionParser);
app.get("*", function(req, res, next) {
req.session.working = "yes!";
res.send("<script>var ws = new WebSocket('ws://localhost:3000');</script>");
});
var ws = new require("ws").Server({server: server});
ws.on("connection", function connection(req) {
sessionParser(req.upgradeReq, {}, function(){
console.log("New websocket connection:");
var sess = req.upgradeReq.session;
console.log("working = " + sess.working);
});
});
server.listen(3000);
Run Code Online (Sandbox Code Playgroud)
在 3.2.0 版中,ws您必须做一些不同的事情。
存储库中有一个快速会话解析的完整工作示例ws,特别是使用新功能verifyClient。
一个非常简短的使用总结:
const sessionParser = session({
saveUninitialized: false,
secret: '$eCuRiTy',
resave: false
})
const server = http.createServer(app)
const wss = new WebSocket.Server({
verifyClient: (info, done) => {
console.log('Parsing session from request...')
sessionParser(info.req, {}, () => {
console.log('Session is parsed!')
done(info.req.session.userId)
})
},
server
})
wss.on('connection', (ws, req) => {
ws.on('message', (message) => {
console.log(`WS message ${message} from user ${req.session.userId}`)
})
})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20437 次 |
| 最近记录: |