我通过 nJWT 包使用 JWT token ,通过 socket.io-jwt 包对我的 Socket.io 用户进行身份验证。
或多或少,代码看起来像这样。用户通过 HTML 表单发送 POST 请求进行播放/登录,以生成 JWT token 。然后,socket.io 客户端使用该 token 进行初始化。
/**
* Create Express server.
*/
const app = express();
const http = require('http').Server(app);
const io = require('socket.io')(http);
const socketioJwt = require('socketio-jwt');
app.set('jwt.secret', secureRandom(256, {
type: 'Buffer'
}));
app.post('/play/login', (req, res) => {
// validate user's req.body.email and req.body.password
const claims = {
iss: "http://app.dev", // The URL of your service
sub: "user-1", // The UID of the user in your system
scope: "game"
};
const jwt = nJwt.create(claims, app.get("jwt.secret"));
const token = jwt.compact();
new Cookies(req,res).set('access_token', token, {
httpOnly: true,
secure: process.env.ENVIRONMENT === "production"
});
tokenUserRelations[token] = req.body.email;
res.json({
code: 200,
token: token
});
});
/**
* Add Socket IO auth middleware
*/
io.set('authorization', socketioJwt.authorize({
secret: app.get("jwt.secret"),
handshake: true
}));
io.sockets.on('connection', function (socket) {
socket.on('chat message', function (req) {
io.emit("chat message emit", {
email: tokenUserRelations[socket.handshake.query.token],
msg: req.msg
});
});
socket.on('debug', function (req) {
io.emit("debug emit", {
playersOnline: Object.keys(tokenUserRelations).length
});
});
socket.on('disconnect', function (req) {
delete tokenUserRelations[socket.handshake.query.token];
});
});
io.listen(app.get('socket.port'), () => {
console.log('Started! Socket server listening on port %d in %s mode', app.get('socket.port'), app.get('env'));
});
现在,它可以正常工作,但为了跟踪来自 token 的电子邮件,我必须这样做:
tokenUserRelations[token] = req.body.email;
这样我就可以关联 token 指向哪个用户。
我有一种感觉,在全局对象中保留 token <->电子邮件关系将来会让我头疼,尤其是当 token /cookie 过期时。
有没有更好的办法呢?我需要知道 JWT token 指向哪个用户,以便我可以用它们执行一些业务逻辑。
谢谢。
最佳答案
token 可以包含您想要的任何信息,该信息与 token 一起加密。
您可以做的是加密 token 中的用户 ID,当您收到请求时,解密 token (无论如何,当您验证它时都会完成),并正常使用用户 ID。
这样,如果 token 过期,新 token 将具有相同的用户 ID,并且您的代码不会受到影响。
这就是我在我的一个网络应用程序中所做的,并且效果很好。但是,我使用的是 official jwt module
关于node.js - 使用 JWT token 。有更好的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38636916/