以下に、PassportをReactアプリに統合するための手順を示します。
- パッケージのインストール: まず、Reactアプリのルートディレクトリで以下のコマンドを実行して、必要なパッケージをインストールします。
npm install passport passport-local passport-jwt bcrypt
npm install passport-local-mongoose express-session
- Passportの設定:
Passportを使用する前に、
passport.js
という名前の新しいファイルを作成し、以下のコードを記述します。
// passport.js
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const JwtStrategy = require('passport-jwt').Strategy;
const ExtractJwt = require('passport-jwt').ExtractJwt;
const bcrypt = require('bcrypt');
const User = require('./models/User'); // ユーザーモデルのパスを適切に指定する
// ローカルストラテジーの設定
passport.use(new LocalStrategy({
usernameField: 'email', // ユーザー名のフィールド名を指定する
passwordField: 'password' // パスワードのフィールド名を指定する
},
async (email, password, done) => {
try {
const user = await User.findOne({ email });
if (!user) {
return done(null, false, { message: 'ユーザーが見つかりません' });
}
const isMatch = await bcrypt.compare(password, user.password);
if (isMatch) {
return done(null, user);
} else {
return done(null, false, { message: 'パスワードが一致しません' });
}
} catch (error) {
return done(error);
}
}
));
// JWTストラテジーの設定
passport.use(new JwtStrategy({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
secretOrKey: 'your_secret_key' // 実際のアプリケーションでは環境変数などを使用することをおすすめします
},
async (payload, done) => {
try {
const user = await User.findById(payload.sub);
if (user) {
return done(null, user);
} else {
return done(null, false);
}
} catch (error) {
return done(error);
}
}
));
- ExpressアプリへのPassportの統合:
Expressアプリのエントリーポイント(通常は
index.js
またはapp.js
)で、以下のコードを追加してPassportを使用できるようにします。
// index.js もしくは app.js
const express = require('express');
const session = require('express-session');
const passport = require('passport');
const { initialize } = require('passport');
const { sessionConfig } = require('./config'); // セッションの設定を適切に指定する
require('./passport'); // passport.jsのパスを適切に指定する
const app = express();
// セッションの設定
app.use(session(sessionConfig));
// Passportの初期化とセッションの設定
app.use(passport.initialize());
app.use(passport.session());
// ログインエンドポイントの設定
app.post('/login', passport.authenticate('local'), (req, res) => {
// ログイン成功時の処理
res.json({ message: 'ログインに成功しました' });
});
// 他のルートやミドルウェアをここに追加
app.listen(3000, () => {
console.log('サーバーがポート3000で起動しました');
});
4. Reactアプリからの認証リクエスト:
Reactアプリ内で認証リクエストを行うためには、適切なAPIエンドポイントを作成し、ログインフォームやトークンの送信などのUIを実装する必要があります。以下は、Axiosを使用してログインリクエストを送信する例です。
```javascript
import axios from 'axios';
const login = async (email, password) => {
try {
const response = await axios.post('/login', { email, password });
console.log(response.data.message); // レスポンスのメッセージを表示するなどの処理を行う
} catch (error) {
console.error(error);
}
}
// ログインボタンがクリックされたときなど、適切なタイミングでlogin関数を呼び出す
これで、ReactアプリにPassportを導入して認証機能を実装する準備が整いました。適切なエンドポイントやモデルのパスなど、具体的なアプリケーションの要件に合わせてコードを調整してください。
以上が、ReactアプリにPassportを導入する方法の概要です。セキュリティや認証に関する詳細な情報を学びたい場合は、公式のPassportドキュメントを参照してください。