Passport.js — local strategiya, JWT strategiya

~20 daq · Express · Autentifikatsiya va Xavfsizlik

Passport.js nima uchun kerak?

Oldingi darslarda JWT va bcrypt bilan autentifikatsiyani qo'lda yozdik. Bu ishlaydi. Lekin loyiha o'sganda — Google bilan login, Facebook bilan login, GitHub bilan login qo'shish kerak bo'ladi. Har birini qo'lda yozish — juda ko'p takroriy kod.

Passport.js — autentifikatsiya uchun middleware. U "strategiya" tushunchasini kiritadi: har bir login usuli — alohida strategiya. Local (email/parol), Google, Facebook, JWT — bularning hammasi tayyor strategiyalar. Siz faqat sozlaysiz.

Hayotiy o'xshatma: xavfsizlik kompaniyasi. Ular turli usullar bilan kirish imkonini beradi — kalit karta, barmoq izi, yuz tanish. Siz har birini o'zingiz o'rnatmaysiz — kompaniya o'zi boshqaradi. Passport — o'sha kompaniya.

npm install passport passport-local passport-jwt

Local strategiya — email va parol

Local strategiya — eng oddiy: email va parol bilan login.

const passport       = require('passport');
const LocalStrategy  = require('passport-local').Strategy;
const bcrypt         = require('bcrypt');

passport.use(new LocalStrategy(
  { usernameField: 'email' }, // standart 'username' o'rniga 'email' ishlatamiz
  async (email, password, done) => {
    try {
      const result = await pool.query('SELECT * FROM users WHERE email = $1', [email]);
      const user   = result.rows[0];

      if (!user) {
        return done(null, false, { message: 'Email yoki parol noto\'g\'ri' });
      }

      const isValid = await bcrypt.compare(password, user.password_hash);
      if (!isValid) {
        return done(null, false, { message: 'Email yoki parol noto\'g\'ri' });
      }

      return done(null, user); // muvaffaqiyatli
    } catch (err) {
      return done(err); // texnik xato
    }
  }
));

done — Passport ning callback i. Uch holat:

  • done(err) — texnik xato (ma'lumotlar bazasi ishlamadi)
  • done(null, false, { message }) — autentifikatsiya muvaffaqiyatsiz (parol noto'g'ri)
  • done(null, user) — muvaffaqiyatli, user ob'ekti keyingi middleware ga uzatiladi

JWT strategiya

JWT strategiya — har so'rovda tokenni tekshiradi.

const JwtStrategy  = require('passport-jwt').Strategy;
const ExtractJwt   = require('passport-jwt').ExtractJwt;

passport.use(new JwtStrategy(
  {
    jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
    secretOrKey:    process.env.JWT_SECRET,
  },
  async (payload, done) => {
    try {
      const result = await pool.query('SELECT id, name, email, role FROM users WHERE id = $1', [payload.userId]);
      const user   = result.rows[0];

      if (!user) return done(null, false);
      return done(null, user);
    } catch (err) {
      return done(err);
    }
  }
));

ExtractJwt.fromAuthHeaderAsBearerToken() — Authorization: Bearer <token> headeridan tokenni oladi.


App ga ulash

const passport = require('passport');
require('./config/passport'); // strategiyalar sozlanadi

app.use(passport.initialize());

passport.initialize() — Passport ni Express ga ulaydi. Session ishlatilmasa — passport.session() kerak emas.


Route larda ishlatish

// Login — local strategiya
router.post('/login', (req, res, next) => {
  passport.authenticate('local', { session: false }, (err, user, info) => {
    if (err)   return next(err);
    if (!user) return res.status(401).json({ message: info.message });

    const token = jwt.sign(
      { userId: user.id, role: user.role },
      process.env.JWT_SECRET,
      { expiresIn: '15m' }
    );

    res.json({ token });
  })(req, res, next);
});

// Himoyalangan route — JWT strategiya
router.get('/profile',
  passport.authenticate('jwt', { session: false }),
  (req, res) => {
    res.json(req.user); // passport req.user ga foydalanuvchini qo'yadi
  }
);

{ session: false } — session ishlatilmaydi, JWT ishlatiladi.


Passport vs qo'lda yozish — qachon qaysi?

Passport — ko'p strategiya kerak bo'lganda foydali. Faqat JWT ishlatilsa — qo'lda yozilgan middleware ham yetarli, Passport ortiqcha murakkablik qo'shadi.

Faqat JWT/local  → qo'lda middleware (oddiyroq)
Google, GitHub,
Facebook ham kerak → Passport (strategiyalar tayyor)

Tez-tez uchraydigan xatolar

passport.initialize() ni unutish:

// Xato — Passport ishlamaydi:
app.use('/api', router);

// To'g'ri — avval initialize:
app.use(passport.initialize());
app.use('/api', router);

{ session: false } ni unutish:

passport.authenticate('jwt') // session ochishga urinadi — xato
passport.authenticate('jwt', { session: false }) // to'g'ri

JWT bilan session kerak emas — har doim { session: false }.


Xulosa

Passport.js — autentifikatsiya uchun middleware. Strategiyalar orqali turli login usullarini qo'shish oson.

Local strategiya — email/parol. JWT strategiya — tokenni tekshirish. done(null, user) — muvaffaqiyatli, done(null, false) — muvaffaqiyatsiz.

Faqat JWT ishlatilsa — qo'lda middleware ham yetarli. Ko'p strategiya kerak bo'lsa — Passport.


Keyingi dars

23-dars: Google OAuth — Passport bilan