Node.js での Socket.IO JWT 認証
概念
- JWT (JSON Web Token): データを安全にやり取りするためのトークン形式の標準
- socket.io: 双方向リアルタイム通信ライブラリ
- Node.js: JavaScript 実行環境
目的
socket.io
を介した通信は双方向でリアルタイムに行われるため、接続してきたクライアントが正当なユーザーかどうかを確認する必要があります。JWT を用いることで、クライアントが持つトークンをサーバー側で検証し、認証を行うことが可能です。
実装方法
主に2通りの方法があります。
公式ドキュメント方式
Socket.IO の公式ドキュメントでは、io.engine.use
ミドルウェアを使って passport.js
ライブラリと連携させる方法が紹介されています。
- 検証に成功した場合、ソケットオブジェクトにユーザー情報が格納され、以降の通信で利用できます。
passport.js
は JWT 検証を行うライブラリです。io.engine.use
ミドルウェアはソケット接続のハンドシェイク処理時に呼ばれます。
socketio-jwt ライブラリを使う方法
socketio-jwt
ライブラリを使うと、より簡単に JWT 認証を実装できます。
- サーバー側でミドルウェアが JWT を検証し、成功した場合にソケット接続が確立されます。
- クライアントが接続時に JWT をヘッダーに付加して送信します。
- サーバー側で
socketio-jwt
をインストールし、ミドルウェアとしてio.use
に設定します。
どちらの方法を選ぶかは、プロジェクトの規模や複雑さに応じて選択します。socketio-jwt
ライブラリはより手軽ですが、passport.js
を使えばより柔軟な認証フローを構築できます。
注意点
- トークンの盗難を防ぐため、トークンの有効期限を設定するなどセキュリティ対策が必要です。
- JWT 自体を適切に発行・検証する必要があります。
Node.js での Socket.IO JWT 認証 - コード例
ここでは、2つの方法で Socket.IO 接続の JWT 認証を実装するコード例を紹介します。
公式ドキュメント方式 (passport.js 使用)
サーバー側 (Node.js)
const express = require
ライブラリのインストール
まず、socketio-jwt
ライブラリをプロジェクトにインストールします。
npm install socketio-jwt
const express = require('express');
const app = express();
const http = require('http').Server(app);
const io = require('socket.io')(http);
const jwt = require('jsonwebto ken'); // JWT 検証用
const socketioJwt = require('socketio-jwt'); // JWT 認証ミドルウェア
// シークレットキー (JWT 生成・検証に必要)
const secretKey = 'your_secret_key';
// socketio-jwt ミドルウェアの設定
io.use(socketioJwt.authenticate({ secret: secretKey }, (decoded, socket, next) => {
// 検証成功時の処理 (オプション)
console.log('ユーザー認証成功:', decoded.userId);
next();
}));
// 以下はソケット接続時のイベント処理など
io.on('connection', (socket) => {
// ...
});
http.listen(3000, () => {
console.log('サーバー起動中 (ポート: 3000)');
});
クライアント側
// (例: JavaScript)
const socket = io.connect('http://localhost:3000', {
// 接続オプション
transports: ['websocket'],
extraHeaders: {
Authorization: `Bearer ${yourJWTToken}`,
},
});
// 以下はソケット通信処理など
socket.on('connect', () => {
console.log('ソケット接続成功');
});
ポイント
- クライアント側では、JWT をヘッダー
Authorization
にBearer
プレフィックス付きで付加します。 - サーバー側でシークレットキーを適切に設定・管理する必要があります。
この socketio-jwt
ライブラリを使った方法は、公式ドキュメント方式よりも手軽に実装できます。ただし、passport.js
を使ったほうが柔軟な認証フローを構築できるという点も覚えておきましょう。
node.js socket.io jwt