Node.js 如何使用JWT使用node、ws和passport对web套接字进行身份验证?
我有一个用node/express编写的web服务器,它使用passport使用JSON web令牌(JWT)对用户进行身份验证 对于常规HTTP方法,我使用的是:Node.js 如何使用JWT使用node、ws和passport对web套接字进行身份验证?,node.js,express,websocket,jwt,passport.js,Node.js,Express,Websocket,Jwt,Passport.js,我有一个用node/express编写的web服务器,它使用passport使用JSON web令牌(JWT)对用户进行身份验证 对于常规HTTP方法,我使用的是: app.get('/api/stuff', isLoggedIn(), (req, res) => { //get stuff res.send( whatever ); }); 其中isLoggedIn是此函数: function isLoggedIn() { return passport.aut
app.get('/api/stuff', isLoggedIn(), (req, res) => {
//get stuff
res.send( whatever );
});
其中isLoggedIn
是此函数:
function isLoggedIn() {
return passport.authenticate('local-jwt', { session: false });
}
身份验证本身由passport中的'local-jwt'
配置使用JWTStrategy
对象进行处理,并按预期工作
现在我需要将web套接字添加到此应用程序。我正在使用ws库。以下是我到目前为止的情况:
const wss = new WebSocket.Server({
port: 8080,
verifyClient: async (info, done) => {
// ???
done( result );
}
});
wss.on('connection', ws => {
// web socket events
});
如何使用passport身份验证仅允许具有正确令牌的客户端连接到web套接字服务器?您可以
使用用户id或用于区分用户的任何内容对令牌进行签名
var today = new Date();
var exp = new Date(today);
exp.setDate(today.getDate() + 60);
jwt.sign({
id: user._id,
exp: parseInt(exp.getTime() / 1000),
}, secret);
然后将令牌传递到前端并使用它初始化Websocket连接,并将其附加到url中,然后在服务器中获取并解码它,如下所示
const wss = new WebSocket.Server({
verifyClient: async (info, done) => {
console.log(info.req.url);
console.log('------verify client------');
const token = info.req.url.split('/')[1];
var decoded = jwt.verify(token, secret);
info.req.user = await User.findById(decoded.id).exec();
/*info.req.user is either null or the user and you can destroy the connection
if its null */
done(info.req);
},
server
});
这是许多方法之一。会话是有办法的,但我知道你不想使用它们。另外,我不知道您是否使用mongo,但它对于任何数据库都是一样的,您只需更改一些代码