Node.js、Express、認証における Passport シリアル化と逆シリアル化の徹底解説
Node.js、Express、認証における Passport シリアル化と逆シリアル化の理解
シリアル化 とは、ユーザーオブジェクトをバイト列に変換するプロセスです。これは、セッション中にユーザー情報を保存するために必要です。
Passport は、passport.serializeUser
と passport.deserializeUser
という 2 つのコールバック関数を使用して、シリアル化と逆シリアル化を処理します。
シリアル化
passport.serializeUser
は、ユーザー認証後に呼び出されます。この関数は、ユーザーオブジェクトを受け取り、シリアル化されたバイト列を返す必要があります。
passport.serializeUser((user, done) => {
done(null, user.id);
});
上記の例では、ユーザーの ID をシリアル化しています。シリアル化されたデータは、セッションに保存されます。
passport.deserializeUser((id, done) => {
User.findById(id, (err, user) => {
done(err, user);
});
});
上記の例では、シリアル化された ID を使用してユーザーオブジェクトをデータベースから検索しています。
シリアル化と逆シリアル化は、Passport を使用した認証において重要な役割を果たします。これらのプロセスにより、セッション中にユーザー情報を保存し、リクエストごとに復元することができます。
これらの情報に加えて、以下の点にも注意が必要です。
- シリアル化されたデータは、安全な方法で保存する必要があります。
- シリアル化されたデータは、セッションの有効期限が切れた後に破棄する必要があります。
Passport のシリアル化と逆シリアル化は、ユーザー認証とセッション管理を容易にする重要な概念です。これらのプロセスを理解することで、Passport をより効果的に活用することができます。
サンプルコード:Passport シリアル化と逆シリアル化
ファイル:app.js
const express = require('express');
const passport = require('passport');
const session = require('express-session');
const app = express();
// セッション設定
app.use(session({
secret: 'keyboard cat',
resave: false,
saveUninitialized: true,
}));
// Passport 設定
app.use(passport.initialize());
app.use(passport.session());
// シリアル化
passport.serializeUser((user, done) => {
done(null, user.id);
});
// 逆シリアル化
passport.deserializeUser((id, done) => {
User.findById(id, (err, user) => {
done(err, user);
});
});
// ルーティング
app.get('/login', (req, res) => {
// ... ログイン処理 ...
});
app.get('/profile', (req, res) => {
// 認証済みユーザーのみアクセス可能
if (req.isAuthenticated()) {
res.send('プロフィールページ');
} else {
res.redirect('/login');
}
});
app.listen(3000);
ファイル:models/user.js
const mongoose = require('mongoose');
const userSchema = new mongoose.Schema({
username: String,
password: String,
});
const User = mongoose.model('User', userSchema);
module.exports = User;
このサンプルコードでは、ユーザー認証とセッション管理のために Passport と Express を使用しています。
/login
エンドポイントは、ユーザーログイン処理を担当します。/profile
エンドポイントは、認証済みユーザーのみアクセス可能なプロフィールページを表示します。
上記のサンプルコードは基本的な例です。実際のアプリケーションでは、より複雑な認証ロジックを実装する必要がある場合があります。
Passport シリアル化と逆シリアル化の代替方法
JSON シリアル化
JSON は、オブジェクトをシリアル化するための汎用的なフォーマットです。Passport は、passport-local
モジュールなどのいくつかの認証戦略で JSON シリアル化をサポートしています。
passport.serializeUser((user, done) => {
done(null, JSON.stringify(user));
});
passport.deserializeUser((json, done) => {
const user = JSON.parse(json);
done(null, user);
});
カスタムシリアル化
独自のシリアル化方法を実装することもできます。
passport.serializeUser((user, done) => {
const serializedUser = {
id: user.id,
username: user.username,
};
done(null, serializedUser);
});
passport.deserializeUser((serializedUser, done) => {
User.findById(serializedUser.id, (err, user) => {
if (err) {
return done(err);
}
if (!user) {
return done(null, false);
}
user.username = serializedUser.username;
done(null, user);
});
});
セッションに直接保存
シリアル化を使用せずに、ユーザーオブジェクトをセッションに直接保存することもできます。
app.use(passport.initialize());
app.use(passport.session());
app.get('/login', (req, res) => {
// ... ログイン処理 ...
req.session.user = user;
res.redirect('/');
});
app.get('/profile', (req, res) => {
// 認証済みユーザーのみアクセス可能
if (req.session.user) {
res.send('プロフィールページ');
} else {
res.redirect('/login');
}
});
使用する方法は、アプリケーションの要件によって異なります。
- JSON シリアル化は、シンプルな方法でオブジェクトをシリアル化したい場合に適しています。
- カスタムシリアル化は、より複雑な要件がある場合に適しています。
- セッションに直接保存は、シリアル化を避けたい場合に適しています。
node.js authentication express