REST API পাঠ বলেছিল যে যে কেউ একটি product delete করতে পারা উচিত না — এই পাঠ আসলে কীভাবে এটা প্রয়োগ করা হয়: নিরাপদে password hash করা, আর পরের প্রতিটি request-এ কে request করছে তা প্রমাণ করা একটি token issue করা।
bcrypt একটি random salt বেক করা সহ একটি password hash করে — একই password দুবার hash করলে দুটি ভিন্ন ফলাফল তৈরি হয়, যা ঠিক common password-এর একটি precomputed table দিয়ে একটি চুরি হওয়া password database search করা যাওয়া বন্ধ করে।
import bcrypt from 'bcrypt'
// একজন user sign up করলে
const passwordHash = await bcrypt.hash(req.body.password, 10)
// database-এ passwordHash সংরক্ষণ করুন — কখনো plain password না
// একজন user login করলে
const isCorrect = await bcrypt.compare(req.body.password, user.passwordHash)একটি সফল login-এর পর, server একটি JSON Web Token issue করে — একটি signed string যা client প্রতিটি ভবিষ্যতের request-এ (সাধারণত একটি Authorization header-এ) প্রতিবার আবার login করার বদলে ফেরত পাঠায়।
import jwt from 'jsonwebtoken'
// password সঠিক verify করার পর
const token = jwt.sign(
{ userId: user.id },
process.env.JWT_SECRET,
{ expiresIn: '7d' }
)
res.json({ token })function requireAuth(req, res, next) {
const authHeader = req.headers.authorization
const token = authHeader?.split(' ')[1] // "Bearer <token>"
if (!token) {
return res.status(401).json({ error: 'No token provided' })
}
try {
const payload = jwt.verify(token, process.env.JWT_SECRET)
req.userId = payload.userId
next()
} catch {
res.status(401).json({ error: 'Invalid or expired token' })
}
}
app.delete('/products/:id', requireAuth, (req, res) => {
// req.userId এখন উপলব্ধ — এই route শুধু একটি বৈধ token-এর জন্য চলে
})এটা ঠিক আগের Middleware পাঠের একই pattern — requireAuth route handler-এর আগে চলে, আর আসল logic-এ পৌঁছানোর আগেই request সম্পূর্ণভাবে block করতে পারে।
| অংশ | উদ্দেশ্য |
|---|---|
| bcrypt.hash() | সংরক্ষণের জন্য একটি plain password-কে একটি নিরাপদ, salted hash-এ পরিণত করে |
| bcrypt.compare() | একটি login attempt-এর password সংরক্ষিত hash-এর সাথে check করে |
| jwt.sign() | একটি সফল login-এর পর একটি signed token issue করে |
| jwt.verify() | প্রতিটি protected request-এ একটি token আসল আর মেয়াদ শেষ না হয়েছে তা নিশ্চিত করে |
এই পুরো system যে একটি secret-এর উপর নির্ভর করে
JWT_SECRET একটি environment variable-এ রাখা একটি লম্বা, random, private মান হতে হবে — কখনো repo-তে commit করা না। যে কেউ এটা পায় সে যেকোনো user-এর জন্য একটি বৈধ token forge করতে পারে।