const express = require('express'); const jwt = require('jsonwebtoken'); var passport = require('passport'); const JwtStrategy = require('passport-jwt').Strategy; const db = require('../db'); const { PRIV_KEY, PUB_KEY } = require('../config'); const router = express.Router(); router.get('/login', function (req, res, next) { res.render('login'); }); router.post('/login', async (req, res, next) => { const { email, password } = req.body; console.log("/login: " + req.body); const r = await db.query('SELECT * FROM users WHERE email=$1', [email]); if (r.rowCount < 1 || r.rows[0].password !== password) { res.locals.errormsg = 'Wrong credentials'; console.log("login failed"); return res.status(403).render('login'); } const token = jwt.sign({ email }, PRIV_KEY, { algorithm: 'RS256' }); console.log("Login success"); res.cookie('session', token); res.redirect('/'); }); router.get('/register', function (req, res, next) { res.render('register'); }); router.post('/register', async (req, res, next) => { const { email, nickname, password } = req.body; console.log("/register: " + req.body); const reg = /^[\w\.@]{4,40}$/; if (!reg.test(email) || !reg.test(nickname) || !reg.test(password)) { res.locals.errormsg = 'Bad data'; return res.render('register'); } const token = jwt.sign({ email }, PRIV_KEY, { algorithm: 'RS256' }); res.cookie('session', token); try { await db.query('INSERT INTO users (email, nickname, password, propic) VALUES ($1,$2,$3,\'/static/img/default.png\')', [email, nickname, password]); } catch (error) { res.locals.errormsg = 'Email or nickname already used'; res.clearCookie('session'); console.log("register fail"); return res.render('register'); } console.log("register success"); res.redirect('/'); }); router.get('/logout', function (req, res, next) { res.clearCookie('session'); res.redirect('/'); }); const cookieExtractor = function (req) { var token = null; // console.log(req.cookies); if (req && req.cookies) { token = req.cookies['session']; } return token; }; const opts = {}; opts.jwtFromRequest = cookieExtractor; opts.secretOrKey = PUB_KEY; opts.algorithms = ['RS256', 'ES256', 'HS256']; //opts.issuer = 'localhost'; //opts.audience = 'localhost'; passport.use(new JwtStrategy(opts, function (jwt_payload, done) { if (!jwt_payload.email) { return done('Error', false); } return done(null, { email: jwt_payload.email, nickname: jwt_payload.nickname }); })); router.use(passport.authenticate('jwt', { session: false, failureRedirect: '/login' })); module.exports = router;