[解決済み] JWTを用いたソケットIO接続の認証
2022-04-28 18:09:07
質問
socket.ioの接続を認証するにはどうすればよいですか?私のアプリケーションは、他のサーバー(python)からのログインエンドポイントを使用してトークンを取得します。ユーザーがノード側でソケット接続を開くたびに、そのトークンを使用するにはどうすればよいですか?
io.on('connection', function(socket) {
socket.on('message', function(message) {
io.emit('message', message);
});
});
そしてクライアント側。
var token = sessionStorage.token;
var socket = io.connect('http://localhost:3000', {
query: 'token=' + token
});
トークンがpythonで作成された場合。
token = jwt.encode(payload, SECRET_KEY, algorithm='HS256')
このトークンを使ってnodeのソケット接続を認証するにはどうしたらいいですか?
どのように解決するのですか?
トークンが他のサーバーで作成されたものであっても問題ありません。正しい秘密鍵とアルゴリズムがあれば、検証は可能です。
による実装
jsonwebtoken
モジュール
クライアント
const {token} = sessionStorage;
const socket = io.connect('http://localhost:3000', {
query: {token}
});
サーバー
const io = require('socket.io')();
const jwt = require('jsonwebtoken');
io.use(function(socket, next){
if (socket.handshake.query && socket.handshake.query.token){
jwt.verify(socket.handshake.query.token, 'SECRET_KEY', function(err, decoded) {
if (err) return next(new Error('Authentication error'));
socket.decoded = decoded;
next();
});
}
else {
next(new Error('Authentication error'));
}
})
.on('connection', function(socket) {
// Connection now authenticated to receive further events
socket.on('message', function(message) {
io.emit('message', message);
});
});
による実装
socketio-jwt
モジュール
このモジュールは、クライアントとサーバーサイドの両方で、認証をより簡単にします。その例をご覧ください。
クライアント
const {token} = sessionStorage;
const socket = io.connect('http://localhost:3000');
socket.on('connect', function (socket) {
socket
.on('authenticated', function () {
//do other things
})
.emit('authenticate', {token}); //send the jwt
});
サーバー
const io = require('socket.io')();
const socketioJwt = require('socketio-jwt');
io.sockets
.on('connection', socketioJwt.authorize({
secret: 'SECRET_KEY',
timeout: 15000 // 15 seconds to send the authentication message
})).on('authenticated', function(socket) {
//this socket is authenticated, we are good to handle more events from it.
console.log(`Hello! ${socket.decoded_token.name}`);
});
関連
-
[解決済み】AWS STS AssumeRoleへのアクセスを可能にする方法
-
[解決済み] エラー: nodejs の get 呼び出しで getaddrinfo ENOTFOUND が発生しました。
-
[解決済み】Express.js req.bodyが未定義です。
-
[解決済み】Mongooseで、日付でソートするにはどうしたらいいですか?(node.js)
-
[解決済み] Node.jsのホスト名/IPが証明書のaltnamesと一致しない
-
[解決済み] AWS lambda function error - Unable to import module 'index': エラー
-
[解決済み] Node.jsで「btoaが定義されていない」エラーが発生する
-
[解決済み] Macでポート3000をロックしているプロセスを見つける(そして殺す)【終了
-
[解決済み] forEachループでasync/awaitを使用する
-
[解決済み] JWT(JSONウェブトークン)の有効期限を自動的に延長する機能
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】MongoClient v3.0使用時、db.collectionは関数ではない
-
[解決済み】Nodejsの解決方法:Error: ENOENT: そのようなファイルまたはディレクトリがありません
-
[解決済み】Node.jsのホスト名/IPが証明書のaltnamesと一致しない。
-
[解決済み】Heroku + node.jsのエラー(Webプロセスが起動後60秒以内に$PORTにバインドできなかった)。
-
[解決済み】POSTできない/expressを使用するとエラーが発生する
-
[解決済み] create-react-app、インストールエラー("コマンドが見つからない")。
-
[解決済み] Passport JSのreq.isAuthenticated()はどのように実装されていますか?[クローズド]
-
[解決済み] AWS lambda function error - Unable to import module 'index': エラー
-
[解決済み] Json Web Token verify() return jwt malformed
-
[解決済み] "致命的なエラーです。grunt "コマンドを実行すると、"Unable to find local grunt. "と表示されます。