Я использую токены JWT через пакет nJWT для аутентификации моих пользователей на свой Socket.io с использованием пакета socket.io-jwt.Использование жетонов JWT. Есть ли лучший подход?
Более или менее код выглядит следующим образом. Пользователь отправляет запросы POST для воспроизведения/входа через HTML-форму для создания токена 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;
так что я могу связать, какой пользователь точки маркера.
У меня возникло ощущение, что сохранение токена-> отношения с электронной почтой в глобальном объекте вызовут головные боли в будущем, особенно когда истекают токены/куки.
Есть ли лучший способ об этом? Мне нужно знать, какой пользователь указывает на токен JWT, чтобы я мог с ними сделать некоторую бизнес-логику.
спасибо.
Так я должен расшифровать токен каждый раз, когда запрос попадает в мои конечные точки сокета? Если да: A. Есть ли способ установить глобальное перед промежуточным программным обеспечением все мои конечные точки socket.io? B: Будет ли заметное влияние на производительность, поскольку дешифрование может быть задачей для процессора? – Aris
Да, это то, как вы проверяете токен, а не запоминаете их на стороне сервера. Для экспресс-да, но я не знаю, для socket.io. Существует, но не более, чем другие схемы аутентификации. – DrakaSAN
Разве вы не думаете, что могут быть разные подходы? Расшифровка и повторная проверка токена каждый раз звучат не очень хорошо, особенно с точки зрения производительности, потому что я получаю много вызовов сокетов. (Разработка игры, так что у меня много сокетов). Я думал, что все цели сокетов - это идентификация безопасного рукопожатия между обеими сторонами, поэтому все транзакции можно безопасно сделать без дополнительных контролей во время вызовов. Не уверен, что я ошибаюсь, поскольку я не знаком с программированием в реальном времени. – Aris