如何使用带有 JWT 的节点、ws 和护照来验证 Web 套接字?
How to use authenticate web sockets using node, ws and passport with JWT?
我有一个用 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 });
}
身份验证本身由护照中的 'local-jwt'
配置使用 JWTStrategy
对象处理,并且按预期工作。
现在我需要向这个应用程序添加网络套接字。我正在使用 ws 库。这是我目前所拥有的:
const wss = new WebSocket.Server({
port: 8080,
verifyClient: async (info, done) => {
// ???
done( result );
}
});
wss.on('connection', ws => {
// web socket events
});
如何使用护照身份验证只允许具有正确令牌的客户端连接到 Web 套接字服务器?
您可以 sign
带有用户 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 但它对于任何你只需要更改一些代码的数据库都是一样的。
我有一个用 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 });
}
身份验证本身由护照中的 'local-jwt'
配置使用 JWTStrategy
对象处理,并且按预期工作。
现在我需要向这个应用程序添加网络套接字。我正在使用 ws 库。这是我目前所拥有的:
const wss = new WebSocket.Server({
port: 8080,
verifyClient: async (info, done) => {
// ???
done( result );
}
});
wss.on('connection', ws => {
// web socket events
});
如何使用护照身份验证只允许具有正确令牌的客户端连接到 Web 套接字服务器?
您可以 sign
带有用户 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 但它对于任何你只需要更改一些代码的数据库都是一样的。