[英]Using Websocket with Passport
当有人打开 WebSocket 连接时,如何访问当前会话的通行证登录名?
我发现了一个不错的项目express-ws ,它似乎工作得很好
app.ws('/', function(ws, req) {
ws.on('message', function(msg) {
console.log('express-ws --- ', msg);
});
console.log('socket', req.user); //current user == req.user
});
但是我将如何通过普通的 Websocket 连接获取相同的信息?
var WebSocketServer = require('ws').Server,
wss = new WebSocketServer({ port: 3001 });
wss.on('connection', function(socket){
//Where is the current user????
console.log('connection');
socket.on('message', function(message){
console.log('message received', message);
});
});
(这第二个连接确实工作得很好 - 但我一生都找不到任何方法从 Passport 获取登录信息)
在创建 WS 服务器时,添加一个“verifyClient”参数如下以获取会话信息:
const wss = new (require('ws').Server)({
server,
verifyClient: (info, done) => {
sessionParser(info.req, {}, () => {
done(info.req.session)
})
}
})
其中sessionParser
是您的express-session
配置对象。 这允许您通过req.session
在 websocket 中访问它。 如果您使用的是护照,您可能需要req.session.passport.user
..
可以使用ws.upgradeReq.session.passport.user
而不是使用req.session.passport.user
来访问经过身份验证的用户 ID。
app.ws('/', function(ws, req) {
ws.on('message', function(msg) {
console.log('express-ws --- ', msg);
});
console.log(ws.upgradeReq.session.passport.user);
/* keys can be found like
for(var key in ws.upgradeReq.session.passport){
console.log(key);
}
*/
});
也许不是最好的解决方案,但我们可以使用以下代码删除 WS 连接:
const wss = new webSocket.Server({ server, port: 9999})
wss.on('connection', (ws, req) => {
// get token from url: ..url..?token=your_JWT_TOKEN
const params = require('url').parse(req.url, true).query
const { token } = params
// add token to headers (could be done on frontend)
req.headers.authorization = `Bearer ${token}`
// look for the user with token
passport.authenticate(
'jwt',
{
session: false
},
(err, user, info) => {
// If no user close websocket
if (!user) {
console.log('Websocket disconnected due to invalid token')
ws.close()
}
}
)(req)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.