【问题标题】:passport.socket.io cant fix no session foundpassport.socket.io 无法修复未找到会话
【发布时间】: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


【解决方案1】:

握手数据不再存储在同一个地方。不是socket.handshake.user,而是socket.request.user。您还需要使用 IP 地址 (127.0.0.1) 而不是 localhost。所以你去127.0.0.1:PORT而不是localhost:PORT

【讨论】:

  • 在我的客户端 io.connect 或 ?
【解决方案2】:

好的,我明白了
最后,这是一个 CORS 错误,我设法使用这篇文章修复了它。现在,当我尝试注销并让我始终保持登录状态时,我遇到了商店不更新的问题,但是哦,好吧

https://github.com/jfromaniello/passport.socketio/issues/95

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-11
    • 2014-03-12
    • 1970-01-01
    • 2019-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-31
    • 2021-08-18
    相关资源
    最近更新 更多