Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何使用node和express ws在WebSocket中进行身份验证_Node.js_Express_Authentication_Websocket_Access Token - Fatal编程技术网

Node.js 如何使用node和express ws在WebSocket中进行身份验证

Node.js 如何使用node和express ws在WebSocket中进行身份验证,node.js,express,authentication,websocket,access-token,Node.js,Express,Authentication,Websocket,Access Token,我正在使用节点10.16.0、express 4.0.0和模块。在我使用REST的正常路由中,我使用中间件来检查是否有带有令牌的头并验证该令牌 如何对WebSocket执行相同的操作 我不能只将头添加到ws并将其传递到节点路由,即使express ws允许轻松创建express样式的路由 目前,我正在使用http服务器创建ws-server,然后分离不同的express路由 //app.js const app = express(); const wsHttpServer = http.cr

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

如何对WebSocket执行相同的操作

我不能只将头添加到ws并将其传递到节点路由,即使express ws允许轻松创建express样式的路由

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

//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-routes

//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-server是使用http服务器初始化的,并且ws-route还包含一个
req
,那么我可以以某种方式完成吗

还是有其他方法

谢谢你的副本。按照这里的例子

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