私はsocket.io-jwtパッケージを使用して自分のユーザーをSocket.ioに認証するために、nJWTパッケージを介してJWTトークンを使用しています。JWTトークンの使用。より良いアプローチがありますか?
多かれ少なかれ、コードは次のようになります。ユーザーはJWTトークンを生成するためにHTMLフォームを介して再生/ログインするPOST要求を送信します。次に、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:解読がCPU消費タスクになる可能性があるため、パフォーマンスには大きな影響はありませんか? – Aris
はい、トークンを検証する方法であり、サーバー側を覚えておくことではありません。エクスプレスでは、はい、しかし私はsocket.ioについて知らない。存在するが、それ以外の認証スキームはない。 – DrakaSAN
違うアプローチがあると思いませんか?毎回トークンの復号化と再検証は素晴らしいとは言えません。特に、私はソケット呼び出しをたくさん得ているので、パフォーマンスは賢明です。 (私はたくさんのソケットが縛られているゲームを開発しています)ソケットの目的は両側の安全なハンドシェイクを識別することだと思ったので、コール中に追加のコントロールを必要とせずにすべてのトランザクションを安全に行うことができます。リアルタイムプログラミングに精通していないと誤解されているかどうかはわかりません。 – Aris