仅使用JWT在后端保留会话数据

时间:2016-08-24 11:55:18

标签: node.js session express jwt

我在我的应用程序中使用JWT并且我定义了我的声明:

const claims = {
   iss: process.env.DOMAIN,
   scope: "game",
   email: user.get("email")
};

我像这样验证令牌:

nJwt.verify(socket.handshake.query.token, app.get("jwt.secret"), (err, decoded) => {
    if (err) return;
    console.log(decoded.body.email); // doge@doge.com
});

然而,它迫使我将会话数据添加到claims对象中。相反,我想将令牌用作会话标识符,并仅在后端保留会话值,例如:

nJwt.verify(socket.handshake.query.token, app.get("jwt.secret"), (err, decoded) => {
    if (err) return;
    // Since we verified token, read token's session data from backend
});

有没有关于这样做的例子?

聚苯乙烯。我使用Redis,所以我可以通过Redis设置/获取值,但我觉得这样做不好,因为我自己会开发整个会话。

1 个答案:

答案 0 :(得分:1)

要唯一地标识您的令牌,您可以将整个tokenstring作为标识符,尽管由于它太长且不方便,这并没有多大意义。 相反,jwt已经为此目的标准化了一个声明: jti

所以生成这样的令牌:

var claims = {
   iss: process.env.DOMAIN,
   jti: yourGenerateUniqueIdFunction();
};

JWT验证后,您有jti值。 在后端,您可以像这样建立会话K / V商店:

[jti].[keyName] -> [value]

像这样访问K / V:

Session.get('3452345.email') //doge@doge.com

如何实现所需的另一种方法是在express(https://github.com/expressjs/session)中启用默认会话机制, 然后使用https://github.com/tj/connect-redis将会话存储在redis商店中。通过这种方式,您可以轻松地读取和写入req.session,它将被备份到您配置的redis商店。