繁体   English   中英

如何使用 node 和 express-ws 在 websockets 中进行身份验证

[英]How to authenticate in websockets, using node and express-ws

我正在使用节点 10.16.0、express 4.0.0 和express-ws模块。 在我使用 REST 的常规路由中,我使用中间件来检查是否有带有令牌的标头并验证该令牌。

我如何为 websockets 做同样的事情?

我不能只向 ws 添加标头并将其传递给节点路由,即使 express-ws 允许轻松创建 express-style 路由。

目前,我正在使用 http 服务器创建 ws 服务器,然后分离不同的快速路由

//app.js
const app = express();

const wsHttpServer = http.createServer();
wsHttpServer.listen(5001);
const expressWs = require('express-ws')(app , wsHttpServer);

app.use(cors());

app.use(express.static(path.join(__dirname,'public'))); 
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended:false}));
app.use(express.json());
app.use(express.urlencoded({extended:false})); 

app.use('/ws', require('./routes/wsroute')); 
app.use('/login', require('./routes/login'));


const port = process.env.PORT || 4000;
app.listen(port, ()=>{
    console.log('server runs on port ', port);
});

exports.expressWs = expressWs;

然后根据 express-ws 示例,对于 ws 路由

//wsroute.js
router.ws('/users/:name/:date/:time', /*token.validate(),*/  (ws, req) => { 
    const name = req.params.name;  
    const date = req.params.date;
    const time = req.params.time;  
    console.log('ws route');
    console.log('ws route',name, date, time);    
});

如果我取消注释token.validate()部分,这将永远不会控制日志,因为没有带有令牌的标头。

我如何向 ws 添加标题,就像我在 REST 中所做的那样,以便自动检查它? 我想如果 ws 服务器是使用 http 服务器初始化的并且 ws 路由还包含一个req ,我可以以某种方式做到这一点吗?

或者还有其他方法吗?

谢谢

在 node.js 中使用中间件和 express 的 Websockets 令牌身份验证副本。 按照那里的例子。

收听 wsHttpServer.on('upgrade') 事件并在那里执行您选择的身份验证。 如果您愿意,您还可以在升级事件到达您的路线之前附加一个标题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM