const jwt=require('jsonwebtoken'); const bcrypt=require('bcrypt'); const {TOKEN_SECRET, COOKIE_NAME}= require('../config') const userService=require('../services/userService'); module.exports=()=> function(req, res, next){ if (parseToken(req,res)){ req.auth={ async register(username,password){ const token= await register(username, password); res.cookie(COOKIE_NAME, token) }, async login(username, password){ const token=await login(username, password); res.cookie(COOKIE_NAME,token); }, logout(){ res.clearCookie(COOKIE_NAME); } }; next(); } }; async function register(username, password){ //adapt params and validate const existing=await userService.getUserByUsername(username); if (existing){ throw new Error ('Username is taken!'); } const hashedPassword=await bcrypt.hash(password, 10); const user=await userService.createUser(username, hashedPassword); //logi user return generateToken(user); } async function login(username,password){ const user=await userService.getUserByUsername(username); console.log(user) if (!user){ throw new Error ('No such user'); } const hasMatch=await bcrypt.compare(password, user.hashedPassword); console.log(password, user.hashedPassword) if (!hasMatch){ throw new Error ('Incorrect password!') } return generateToken(user); } function generateToken(userData){ return jwt.sign({ _id:userData._id, username:userData.username }, TOKEN_SECRET); } function parseToken(req,res){ const token=req.cookies[COOKIE_NAME]; if (token){ try { const userData=jwt.verify(token, TOKEN_SECRET); req.user=userData; } catch (err) { res.clearCookie(COOKIE_NAME); res.redirect('/auth/login'); return false; } } return true; }