Standard pour authentification stateless. 3 parties séparées par points : Header.Payload.Signature.
import jwt from 'jsonwebtoken';
import bcrypt from 'bcrypt';
// Login endpoint
app.post('/login', async (req, res) => {
const { email, password } = req.body;
const user = await prisma.user.findUnique({ where: { email } });
if (!user) return res.status(401).json({ error: 'Invalid' });
const valid = await bcrypt.compare(password, user.password_hash);
if (!valid) return res.status(401).json({ error: 'Invalid' });
const token = jwt.sign(
{ userId: user.id, email: user.email },
process.env.JWT_SECRET,
{ expiresIn: '7d' }
);
res.json({ token });
});
// Middleware auth
function authMiddleware(req, res, next) {
const token = req.headers.authorization?.split(' ')[1];
if (!token) return res.status(401).end();
try {
req.user = jwt.verify(token, process.env.JWT_SECRET);
next();
} catch (err) {
res.status(401).end();
}
}
⚠️ NE JAMAIS stocker le password en clair. Toujours bcrypt avec rounds >= 10. Et JWT_SECRET au minimum 256-bit aléatoire.