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

时间:2019-11-26 12:21:02

标签: node.js express authentication websocket access-token

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

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

即使express-ws允许轻松创建快速样式的路由,我也不能仅将标题添加到ws并将其传递到节点路由。

当前,我正在使用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()部分,它将永远不会控制日志,因为没有带令牌的标头。

如何像在REST中一样向ws添加标头,以便可以对其进行自动检查?我想如果ws服务器是使用http服务器初始化的,并且ws路由还包含req,我可以以某种方式做到吗?

还是有另一种方法?

谢谢

1 个答案:

答案 0 :(得分:0)

Websockets token authentication using middleware and express in node.js重复。按照那里的示例。

收听wsHttpServer.on('upgrade')事件,然后在此处执行您选择的身份验证。如果您愿意,还可以在升级事件到达路由之前在其上附加标题。