【发布时间】:2016-12-02 21:04:39
【问题描述】:
我通过 nJWT 包使用 JWT 令牌通过 socket.io-jwt 包向我的 Socket.io 验证我的用户。
或多或少,代码看起来像这样。用户通过 HTML 表单发送 POST 请求以播放/登录以生成 JWT 令牌。然后,socket.io 客户端使用该令牌进行初始化。
/**
* 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'));
});
现在,它工作正常,但为了跟踪来自令牌的电子邮件,我必须这样做:
tokenUserRelations[token] = req.body.email;
所以我可以关联令牌指向的用户。
我有一种感觉,将令牌电子邮件关系保存在全局对象中会在未来让我头疼,尤其是在令牌/cookie 过期时。
有没有更好的办法呢?我需要知道 JWT 令牌指向哪个用户,以便我可以对他们执行一些业务逻辑。
谢谢。
【问题讨论】:
标签: node.js sockets authentication express jwt