const express = require('express'); const jwt = require('jsonwebtoken'); const bcrypt = require('bcryptjs'); const User = require('../models/User'); const router = express.Router(); function verifyToken(req, res, next) { const token = req.headers['authorization']; if (!token) return res.status(403).send('No token provided'); jwt.verify(token, process.env.JWT_SECRET, (err, decoded) => { if (err) return res.status(401).send('Invalid token'); req.userId = decoded.id; next(); }); } router.post('/register', async (req, res) => { const hashedPassword = await bcrypt.hash(req.body.password, 8); const user = new User({ ...req.body, password: hashedPassword }); await user.save(); res.send('User registered'); }); router.post('/login', async (req, res) => { const user = await User.findOne({ email: req.body.email }); if (!user) return res.status(404).send('User not found'); const valid = await bcrypt.compare(req.body.password, user.password); if (!valid) return res.status(401).send('Wrong password'); const token = jwt.sign({ id: user._id }, process.env.JWT_SECRET, { expiresIn: '1h' }); res.send({ token }); }); router.get('/dashboard', verifyToken, async (req, res) => { const user = await User.findById(req.userId, { password: 0 }); res.send(user); }); module.exports = router;
Preview:
downloadDownload PNG
downloadDownload JPEG
downloadDownload SVG
Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!
Click to optimize width for Twitter