node.js - 使用 JWT token 。有更好的方法吗?

标签 node.js sockets authentication express jwt

我通过 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/

相关文章:

javascript - 如何将值从 HTML 传递到 Node JS?

linux - Socket编程send()返回值

python - 套接字错误 : Errno 111 Connection Refused

c# - 尝试通过C#程序登录网站

php - 如何在 codeigniter 中创建用户时创建空行

javascript - Sequelize.js 返回关联表的旧值

ajax - 有没有办法验证 ajax 请求是否是从给定域发出的?

javascript - 在 Node 应用程序中加载脚本

c - 如何使用 C 中的原始套接字发送接收到的数据包?

java - 单击 "Login Button"不适用于 Selenium Java 代码