我在我的应用程序中使用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设置/获取值,但我觉得这样做不好,因为我自己会开发整个会话。
答案 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商店。