97 lines
2.7 KiB
JavaScript
Executable File
97 lines
2.7 KiB
JavaScript
Executable File
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;
|