🛂

Passport

2024/04/29に公開

初めてpassportを実装するときに公式ドキュメントを自分なりにわかやすくまとめてみたものです。せっかくなのでアウトプットしようと思い、記事として公開しました。

passport公式ドキュメント

Passport | 認証

Local Strategyについて

実装例

passport.use(
    new LocalStrategy({
  usernameField: 'email',
  passwordField: 'password'
}, async (email, password, done) => {
  try {
    const user = await prisma.user.findUnique({
      where: { email }
    });

    if (!user) {
      return done(null, false, { message: 'Incorrect email.' });
    }

    const isValidPassword = await bcrypt.compare(password, user.password);
    if (!isValidPassword) {
      return done(null, false, { message: 'Incorrect password.' });
    }

    return done(null, user);
  } catch (error) {
    return done(error);
  }
}));

passport.use の第1引数にLocal Strategyを指定することで利用できる。

  • LocalStrategyの引数、usernameFieldpasswordField のオプションを設定することで、LocalStrategy において認証に使用するフィールドを指定する。

passport.use の第2引数には実際の認証システムを記載する。

  • ユーザー名とパスワードを受け取り、その情報を元にデータベースなどからユーザー情報を検索し、認証の成功または失敗を決定する。最終的な結果を done コールバック関数を通じてPassport.jsに返す。
  • done関数について
    • 第1引数: エラーが発生した場合にエラーオブジェクトを渡す。エラーがない場合は null を渡す。
    • 第2引数: 認証が成功した場合にはユーザーオブジェクトを渡す。認証が失敗した場合には false を渡す。
    • 第3引数(オプション): 認証に失敗した場合に、追加の情報を含むオブジェクトを渡すことができる。例えば、エラーメッセージを指定することができる。
      • 実装例
        • ユーザーが見つからない場合:done(null, false, { message: 'Incorrect email.' })
          • 第1引数は null で、エラーはないことを示す。
          • 第2引数は false で、認証が失敗したことを示す。
          • 第3引数は { message: 'Incorrect email.' } で、エラーメッセージを提供する。
        • パスワードが間違っている場合:done(null, false, { message: 'Incorrect password.' })
          • 同様に、エラーはなく、認証失敗の情報とエラーメッセージを含んでいる。
        • ユーザーが見つかり、パスワードも正しい場合:done(null, user)
          • 第1引数は null で、エラーはないことをす。
          • 第2引数は user オブジェクトで、認証が成功したことを示す。
          • 第3引数は省略されている。
    • オプションでそれぞれのストラテジーに名前を付けることができる
      • 以下の実装ではgoogle-adminとして明示することができるが、LocalStrategy・JwtStrategyではlocal、jwtという名前でデフォルトで呼び出すことができる。
passport.use('google-admin', new GoogleStrategy({
    clientID: ADMIN_GOOGLE_CLIENT_ID,
    clientSecret: ADMIN_GOOGLE_CLIENT_SECRET,
    callbackURL: "/auth/google/admin/callback"
}, function(accessToken, refreshToken, profile, cb) {
    // 管理者用アカウントの認証ロジック
}));

Discussion