ReactアプリにPassportを導入する方法


以下に、PassportをReactアプリに統合するための手順を示します。

  1. パッケージのインストール: まず、Reactアプリのルートディレクトリで以下のコマンドを実行して、必要なパッケージをインストールします。
npm install passport passport-local passport-jwt bcrypt
npm install passport-local-mongoose express-session
  1. 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);
    }
  }
));
  1. 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ドキュメントを参照してください。