Login แ แแ แแแ แฐแ
แแแฑ แจแฐแ แ แ แแ! Password Hashing + Token Authentication ๐ฅ
Build secure login systems โ hash passwords with bcrypt, protect routes with JWT tokens!
Authentication (Auth) = "แญแ
แฐแ แแ แแ? Login แแแแ?" โ แแแ
2 แแ tools แฅแแ แแแแ:
bcrypt โ Password แ แฐแ
แแแฑ แฃแ แแแฉ hash แซแฐแญแแ
JWT โ Login แจแแ แ แแ token แญแฐแฃแ โ แแฃแญ requests token แซแตแแแแธแแ!
Authentication = verifying WHO the user is. bcrypt protects passwords. JWT proves the user is logged in.
แแแแฃ แจ Protected Route แตแจแต โ แแ แแฐแต:
Password แ แแฅแณ Database แ แตแแแฅ! แแ แฐแ DB แขแฐแญแ
แแแ passwords แซแซแธแแ! bcrypt password แ hash (แแแ แฅ แจแแญแปแ string) แซแฐแญแแแ!
NEVER store plain text passwords! bcrypt hashes them into an unreadable string. Even bcrypt can't reverse it โ can only verify!
const bcrypt = require('bcryptjs'); // npm install bcryptjs const User = require('../models/User'); // โโ REGISTER โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ router.post('/register', async (req, res) => { const { name, email, password } = req.body; // 1. Email แ แตแแตแ แ แ? const exists = await User.findOne({ email }); if (exists) return res.status(400).json({ error: 'Email in use' }); // 2. Password hash แซแตแญแ (10 = salt rounds) const hashed = await bcrypt.hash(password, 10); // 3. Hash แแ แฅแป DB แแตแฅ แแแฅ โ แแฅแณ แ แญแฐแแ! const user = await User.create({ name, email, password: hashed }); res.status(201).json({ success: true, message: 'Registered!' }); }); // โโ LOGIN โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ router.post('/login', async (req, res) => { const { email, password } = req.body; // 1. User แแแ const user = await User.findOne({ email }); if (!user) return res.status(400).json({ error: 'Invalid credentials' }); // 2. Password แซแจแแแฅ (plain vs hashed) const match = await bcrypt.compare(password, user.password); if (!match) return res.status(400).json({ error: 'Invalid credentials' }); // 3. JWT token แตแฅ โ แแฅแ แฅแแซแแ! const token = jwt.sign({ id: user._id }, process.env.JWT_SECRET, { expiresIn: '7d' }); res.json({ success: true, token }); });
JWT = Login แตแฌแณแ แฒแแ server token แญแฐแฃแ โ แแฃแญ requests แแ แซ token แซแตแแแแธแแ! Server session แ แซแตแแแฅแ โ token แซแฑ แแแ แญแแ!
JWT is a self-contained token. The server doesn't store sessions โ it just verifies the token signature on every request!
๐ JWT Structure โ 3 แญแแแฝ dot แแ แญแแแณแ:
const jwt = require('jsonwebtoken'); // npm install jsonwebtoken // โโ Middleware โ แแแ protected routes แญแ แแแณแ โโ function protect(req, res, next) { // 1. Header แแตแฅ token แ แ? const authHeader = req.headers.authorization; if (!authHeader || !authHeader.startsWith('Bearer ')) { return res.status(401).json({ error: 'No token โ Login แซแตแแแแ!' }); } // 2. Token แ แแญ (Bearer xxxxx โ xxxxx) const token = authHeader.split(' ')[1]; try { // 3. Token แ แซแจแแแฅ const decoded = jwt.verify(token, process.env.JWT_SECRET); req.user = decoded; // user info แแฐ request แจแแญ next(); // แแฅแ แซแแ route แญแแต } catch (err) { res.status(401).json({ error: 'Invalid token!' }); } } // โโ Protected routes โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ router.get('/profile', protect, (req, res) => { res.json({ user: req.user }); // token แซแ แฅแป แญแฐแฃแ! }); router.get('/dashboard', protect, (req, res) => { res.json({ message: 'แฐแแ! Dashboard แฐแจแแฐ!' }); });
๐ก๏ธ Route Protection Levels:
แแ Authentication system แแญแญ! Register โ Password hash แญแแแ | Login โ JWT token แญแฐแฅแแ | Protected Route โ Token แซแ แญแจแแญแแ!
Full auth flow simulation โ register, login, and test protected routes with and without a token!
bcrypt.hash(password, 10) โ 10 salt rounds = แแญแแ hash! bcrypt.compare(plain, hash) โ verify แแแตแจแ!
Never store plain passwords. Hash with 10+ salt rounds. Use bcrypt.compare() to verify on login.
jwt.sign({'{'}id{'}'},secret,{'{'}expiresIn:'7d'{'}'}) โ token แญแฐแฃแแ! jwt.verify(token,secret) โ แซแจแแแฃแแ!
Sign a token on login. Verify it on every protected request. Set expiration (7d, 1h, etc).
function protect(req,res,next) โ Header แแตแฅ token แซแจแแแฃแแข Protected routes แแ แญแ แแแณแ!
Middleware checks for valid JWT before allowing access to protected routes.
Client: Authorization: Bearer <token> โ แแแ protected request แญแ
แ header แญแแซแ!
Send token as: Authorization: Bearer eyJhbGci... in every authenticated request header.
JWT_SECRET=mysecretkey123 โ .env file แแตแฅ แแแฅ! GitHub แแญ แแฝแ แ แตแซแ!
Store JWT_SECRET in .env file. Add .env to .gitignore โ NEVER commit secrets to GitHub!