Passport.js — local strategiya, JWT strategiya
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,userob'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