Node.js 如何使用JWT使用node、ws和passport对web套接字进行身份验证?

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

我有一个用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.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,但它对于任何数据库都是一样的,您只需更改一些代码