【发布时间】:2020-12-10 13:44:21
【问题描述】:
问题
我不断收到错误连接到 socket.io 失败:使用 passport.socketio.js 找不到会话并且找不到原因。我看过其他类似的帖子,但这似乎不是问题。配置对我来说似乎很好,所以我想问题在于连接到 MongoDB 存储,它工作正常,因为我可以在那里看到会话数据,但是如果用户未通过身份验证,则只有 cookie 对象被传递,护照对象为空,或者如果登录则有信息。所以会话对我来说似乎没问题,但我无法使用 socket.handshake 访问会话详细信息,如文档所述。如何确认用户是否在 socket.io 中通过身份验证
编辑
我尝试使用this 共享会话,但即使用户经过身份验证,我也无法仅返回空 cookie 对象的护照
session: Session {
cookie: { path: '/', _expires: null, originalMaxAge: null, httpOnly: true }
}
编辑 2
我注意到在文档中可能存在我之前遇到的 CORS 错误,这可能是我理解的 cookie 未发送的原因。我不得不在服务器端更改 io 因为我有 CORS 错误我不知道这是否可以以任何方式连接。将 localhost 更改为 127.0.0.1 拒绝连接。
const io = require('socket.io')(http, {
cors: {
origin: "http://localhost:3000",
methods: ["GET", "POST"]
}
});
这是 socket.request 的一部分,你可以看到没有 sessionID。
cleanup: [Function: cleanup],
socketio_version_1: true,
cookie: [Object: null prototype] {},
sessionID: '',
user: { logged_in: false }
相关代码
var session = require('express-session')
const MongoStore = require('connect-mongo')(session);
var passportSocketIo = require("passport.socketio");
var cookieParser = require('cookie-parser');
var sessionStore = new MongoStore({ mongooseConnection: mongoose.connection })
app.use(cookieParser())
var sessionMiddleware = session({
secret: '12345678',
name: 'profile_session',
resave: true,
key: 'connect.sid',
saveUninitialized: true,
store: sessionStore
})
app.use(sessionMiddleware);
io.use(passportSocketIo.authorize({
cookieParser: cookieParser,
key: 'connect.sid',
secret: '12345678',
store: sessionStore,
success: onAuthorizeSuccess,
fail: onAuthorizeFail,
}));
Mongo DB
session
:
{"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"},"passport":{}}
【问题讨论】:
-
尝试在
sessionStore之前移动app.use(cookieParser())
标签: javascript node.js express websocket socket.io