Node.js で REST API 認証を実現するための Passport.js の使い方
このチュートリアルでは、Node.js、Express、Passport.js を使用して REST API 認証を実装する方法を説明します。REST API 認証は、ユーザーが API エンドポイントにアクセスする前に身元を確認するプロセスです。Passport.js は、Node.js 向けの認証ミドルウェアであり、さまざまな認証戦略をサポートしています。
必要なもの
このチュートリアルを完了するには、次のものが必要です。
- テキストエディタまたは IDE
- Node.js と npm がインストールされていること
手順
- プロジェクトのセットアップ
npm init -y
npm install express passport passport-local
- ユーザーモデルの作成
const mongoose = require('mongoose');
const userSchema = new mongoose.Schema({
username: { type: String, required: true, unique: true },
password: { type: String, required: true },
});
const User = mongoose.model('User', userSchema);
module.exports = User;
- 認証戦略の設定
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const User = require('./models/user');
passport.use(new LocalStrategy(User.authenticate()));
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
4. 認証ミドルウェアの使用
const express = require('express');
const passport = require('passport');
const app = express();
app.use(passport.initialize());
app.use(passport.session());
- 認証エンドポイントの作成
app.post('/login', passport.authenticate('local'), (req, res) => {
res.send({ message: 'ログインに成功しました' });
});
- 保護されたエンドポイントの作成
app.get('/protected', passport.authenticate('jwt'), (req, res) => {
res.send({ message: '保護されたリソースにアクセスしました' });
});
- サーバーの起動
const app = require('./app');
const port = process.env.PORT || 3000;
app.listen(port, () => {
console.log(`サーバーが ${port} 番ポートで起動しました。`);
});
説明
- 最初に、
express
、passport
、passport-local
パッケージをインストールします。 - 次に、ユーザー名とパスワードを格納するためのユーザーモデルを作成します。
- 認証戦略を設定するには、
passport-local
パッケージを使用します。この戦略は、ユーザー名とパスワードを使用してユーザーを認証します。 - 認証ミドルウェアを使用するには、
passport.initialize()
とpassport.session()
関数を呼び出します。これにより、Passport がリクエストを処理できるようになります。 - 認証エンドポイントを作成するには、
passport.authenticate()
関数を使用します。この関数は、ユーザーがログインを試みる際に使用されます。 - 保護されたエンドポイントを作成するには、
passport.authenticate('jwt')
関数を呼び出します。この関数は、ユーザーが保護されたリソースにアクセスしようとする際に使用されます。 - 最後に、サーバーを起動します。
このチュートリアルでは、Node.js で REST API 認証を実装する方法を説明しました。Passport.js を使用して、さまざまな認証戦略を簡単に実装できます。
- このチュートリアルでは、基本的な認証フローのみを説明しています。本番環境では、より高度なセキュリティ対策を講じる必要があります。
const express = require('express');
const passport = require('passport');
const User = require('./models/user');
const app = express();
// 認証ミドルウェアを使用
app.use(passport.initialize());
app.use(passport.session());
// 認証戦略を設定
passport.use(new LocalStrategy(User.authenticate()));
// シリアライズとデシリアライズを設定
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
// ログインエンドポイント
app.post('/login', passport.authenticate('local'), (req, res) => {
res.send({ message: 'ログインに成功しました' });
});
// 保護されたエンドポイント
app.get('/protected', passport.authenticate('jwt'), (req, res) => {
res.send({ message: '保護されたリソースにアクセスしました' });
});
// サーバーの起動
const port = process.env.PORT || 3000;
app.listen(port, () => {
console.log(`サーバーが ${port} 番ポートで起動しました。`);
});
models/user.js
const mongoose = require('mongoose');
const userSchema = new mongoose.Schema({
username: { type: String, required: true, unique: true },
password: { type: String, required: true },
});
const User = mongoose.model('User', userSchema);
module.exports = User;
このコードの説明は次のとおりです。
const port = process.env.PORT || 3000; app.listen(port, () => { console.log(
サーバーが ${port} 番ポートで起動しました。); });
は、サーバーを起動します。app.get('/protected', passport.authenticate('jwt'), (req, res) => { res.send({ message: '保護されたリソースにアクセスしました' }); });
は、保護されたエンドポイントを作成します。passport.serializeUser(User.serializeUser());
とpassport.deserializeUser(User.deserializeUser());
は、シリアライズとデシリアライズを設定します。これにより、Passport はユーザーセッションを管理できます。passport.use(new LocalStrategy(User.authenticate()));
は、認証戦略を設定します。この戦略は、ユーザー名とパスワードを使用してユーザーを認証します。app.use(passport.initialize());
とapp.use(passport.session());
は、認証ミドルウェアを使用します。
const User = mongoose.model('User', userSchema);
は、ユーザーモデルをエクスポートします。const userSchema = new mongoose.Schema({ username: { type: String, required: true, unique: true }, password: { type: String, required: true }, });
は、ユーザーモデルを作成します。
使用方法
このコードを使用するには、次の手順を実行する必要があります。
npm init -y
コマンドを使用して新しい Node.js プロジェクトを作成します。- プロジェクトディレクトリに移動します。
npm install express passport passport-local mongoose
コマンドを使用して、必要なパッケージをインストールします。app.js
とmodels/user.js
ファイルを作成し、上記のコードを貼り付けます。mongoose.connect('mongodb://localhost:27017/test')
コマンドを使用して、MongoDB データベースに接続します。node app.js
コマンドを実行してサーバーを起動します。
ブラウザで http://localhost:3000/login
にアクセスすると、ログインフォームが表示されます。ユーザー名とパスワードを入力してログインすると、http://localhost:3000/protected
にアクセスできるようになります。
注意事項
- 本番環境では、より高度なセキュリティ対策を講じる必要があります。
- このコードはあくまで例であり、本番環境で使用するには十分ではありません。
- カスタム認証: 独自の認証スキームを実装することもできます。これは、特定のニーズに合わせて認証をカスタマイズする必要がある場合に役立ちます。
- OAuth: OAuth は、ユーザーがサードパーティアプリケーションに自分のアカウントへのアクセスを許可できるようにする認可プロトコルです。これは、ソーシャルログインなどのシナリオに役立ちます。
- JSON Web Token (JWT): JWT は、トークンベースの認証ソリューションです。ユーザーがログインすると、サーバーは JWT を発行し、ユーザーは次回のリクエストでそのトークンをヘッダーに含めます。サーバーはトークンを検証してユーザーを認証します。
各オプションの比較
オプション | 長所 | 短所 |
---|---|---|
Passport.js | 使いやすい、多くの認証戦略をサポート | 設定が複雑になる可能性がある |
JWT | シンプル、ステートレス | セキュリティ上の懸念がある |
OAuth | ソーシャルログインに適している | 設定と実装が複雑 |
カスタム認証 | 完全な制御が可能 | 実装とメンテナンスが困難 |
最適なオプションの選択
最適なオプションは、ニーズによって異なります。シンプルな認証ソリューションが必要な場合は、JWT が良い選択肢です。ソーシャルログインが必要な場合は、OAuth が良い選択肢です。高度なカスタマイズが必要な場合は、カスタム認証が最適な選択肢となる可能性があります。
node.js rest authentication