refactor passport

This commit is contained in:
HF 2022-06-21 01:46:35 +02:00
parent 42ba4c82b6
commit 038cb8b6e1
4 changed files with 151 additions and 134 deletions

View File

@ -56,11 +56,11 @@ passport.use(new JsonStrategy({
where: query,
});
if (!reguser) {
done(null, false, { message: 'Name or Email does not exist!' });
done(new Error('Name or Email does not exist!'));
return;
}
if (!compareToHash(password, reguser.password)) {
done(null, false, { message: 'Incorrect password!' });
done(new Error('Incorrect password!'));
return;
}
const user = new User();

View File

@ -7,6 +7,7 @@ import express from 'express';
import logger from '../../../core/logger';
import { getHostFromRequest } from '../../../utils/ip';
import passport from '../../../core/passport';
import register from './register';
import verify from './verify';
@ -30,143 +31,162 @@ import getMe from '../../../core/me';
const router = express.Router();
export default (passport) => {
router.get('/logout', logout);
/*
* third party logon
*/
router.get('/facebook', passport.authenticate('facebook',
{ scope: ['email'] }));
router.get('/facebook/return', (req: Request, res: Response, next) => {
passport.authenticate('facebook', (err, user, info) => {
if (err) return next(err);
if (!user) return next(new Error(info.message));
req.logIn(user, (error) => {
if (error) return next(error);
return res.redirect('/');
});
return null;
})(req, res, next);
router.get('/facebook', passport.authenticate('facebook',
{ scope: ['email'] }));
router.get('/facebook/return', (req: Request, res: Response, next) => {
passport.authenticate('facebook', (err, user, info) => {
if (err) return next(err);
if (!user) return next(new Error(info.message));
req.logIn(user, (error) => {
if (error) return next(error);
return res.redirect('/');
});
return null;
})(req, res, next);
});
router.get('/discord', passport.authenticate('discord',
{ scope: ['identify', 'email'] }));
router.get('/discord/return', (req: Request, res: Response, next) => {
passport.authenticate('discord', (err, user, info) => {
if (err) return next(err);
if (!user) return next(new Error(info.message));
req.logIn(user, (error) => {
if (error) return next(error);
return res.redirect('/');
});
return null;
})(req, res, next);
});
router.get('/google', passport.authenticate('google',
{ scope: ['email', 'profile'] }));
router.get('/google/return', (req: Request, res: Response, next) => {
passport.authenticate('google', (err, user, info) => {
if (err) return next(err);
if (!user) return next(new Error(info.message));
req.logIn(user, (error) => {
if (error) return next(error);
return res.redirect('/');
});
return null;
})(req, res, next);
});
router.get('/vk', passport.authenticate('vkontakte',
{ scope: ['email'] }));
router.get('/vk/return', (req: Request, res: Response, next) => {
passport.authenticate('vkontakte', (err, user, info) => {
if (err) return next(err);
if (!user) return next(new Error(info.message));
req.logIn(user, (error) => {
if (error) return next(error);
return res.redirect('/');
});
return null;
})(req, res, next);
});
router.get('/reddit', passport.authenticate('reddit',
{ duration: 'temporary', state: 'foo' }));
router.get('/reddit/return', (req: Request, res: Response, next) => {
passport.authenticate('reddit', (err, user, info) => {
if (err) return next(err);
if (!user) return next(new Error(info.message));
req.logIn(user, (error) => {
if (error) return next(error);
return res.redirect('/');
});
return null;
})(req, res, next);
});
// eslint-disable-next-line no-unused-vars
router.use((err, req, res, next) => {
const host = getHostFromRequest(req);
logger.info(`Authentification error ${err}`);
const index = getHtml(
'OAuth Authentification',
err.message, host, req.lang,
);
res.status(400).send(index);
});
/*
* JSON APIs
*/
router.get('/verify', verify);
router.get('/logout', logout);
router.get('/resend_verify', resend_verify);
router.post('/change_passwd', change_passwd);
router.post('/change_name', change_name);
router.post('/change_mail', change_mail);
router.post('/delete_account', delete_account);
router.post('/restore_password', restore_password);
router.post('/local', passport.authenticate('json'), async (req, res) => {
const { user } = req;
const me = await getMe(user, req.lang);
logger.info(`User ${user.id} logged in with mail/password.`);
res.json({
success: true,
me,
});
router.get('/discord', passport.authenticate('discord',
{ scope: ['identify', 'email'] }));
router.get('/discord/return', (req: Request, res: Response, next) => {
passport.authenticate('discord', (err, user, info) => {
if (err) return next(err);
if (!user) return next(new Error(info.message));
req.logIn(user, (error) => {
if (error) return next(error);
return res.redirect('/');
});
/*
router.post('/local', async (req: Request, res: Response, next) => {
passport.authenticate('json', async (err, user, info) => {
if (!user) {
res.status(400);
res.json({
errors: [info.message],
});
return null;
})(req, res, next);
});
router.get('/google', passport.authenticate('google',
{ scope: ['email', 'profile'] }));
router.get('/google/return', (req: Request, res: Response, next) => {
passport.authenticate('google', (err, user, info) => {
if (err) return next(err);
if (!user) return next(new Error(info.message));
req.logIn(user, (error) => {
if (error) return next(error);
return res.redirect('/');
});
return null;
})(req, res, next);
});
router.get('/vk', passport.authenticate('vkontakte',
{ scope: ['email'] }));
router.get('/vk/return', (req: Request, res: Response, next) => {
passport.authenticate('vkontakte', (err, user, info) => {
if (err) return next(err);
if (!user) return next(new Error(info.message));
req.logIn(user, (error) => {
if (error) return next(error);
return res.redirect('/');
});
return null;
})(req, res, next);
});
router.get('/reddit', passport.authenticate('reddit',
{ duration: 'temporary', state: 'foo' }));
router.get('/reddit/return', (req: Request, res: Response, next) => {
passport.authenticate('reddit', (err, user, info) => {
if (err) return next(err);
if (!user) return next(new Error(info.message));
req.logIn(user, (error) => {
if (error) return next(error);
return res.redirect('/');
});
return null;
})(req, res, next);
});
router.use((err, req, res, next) => {
if (err) {
const host = getHostFromRequest(req);
logger.info(`Authentification error ${err}`);
const index = getHtml(
'OAuth Authentification',
err.message, host, req.lang,
);
res.status(400).send(index);
} else {
next();
return;
}
});
logger.info(`User ${user.id} logged in with mail/password.`);
router.get('/verify', verify);
router.get('/logout', logout);
router.get('/resend_verify', resend_verify);
router.post('/change_passwd', change_passwd);
router.post('/change_name', change_name);
router.post('/change_mail', change_mail);
router.post('/delete_account', delete_account);
router.post('/restore_password', restore_password);
// while previous auth methosed work by redirect,
// local strategy is an json API
router.post('/local', async (req: Request, res: Response, next) => {
passport.authenticate('json', async (err, user, info) => {
if (!user) {
res.status(400);
req.logIn(user, async (e) => {
if (e) {
logger.warn(`Login Error:${e.message}`);
res.json({
errors: [info.message],
success: false,
errors: ['Failed to establish session. Please try again later :('],
});
return;
}
logger.info(`User ${user.id} logged in with mail/password.`);
req.logIn(user, async (e) => {
if (e) {
logger.warn(`Login Error:${e.message}`);
res.json({
success: false,
errors: ['Failed to establish session. Please try again later :('],
});
return;
}
user.ip = req.user.ip;
const me = await getMe(user, req.lang);
res.json({
success: true,
me,
});
user.ip = req.user.ip;
const me = await getMe(user, req.lang);
res.json({
success: true,
me,
});
})(req, res, next);
});
})(req, res, next);
});
*/
router.post('/register', register);
// eslint-disable-next-line no-unused-vars
router.use((err, req, res, next) => {
console.warn(`ERROR HANDLER CALLED ${err.message}`);
res.status(400);
res.json({
errors: [err.message],
});
});
router.post('/register', register);
return router;
};
export default router;

View File

@ -85,6 +85,6 @@ router.get('/chathistory', chatHistory);
router.get('/me', me);
router.use('/auth', auth(passport));
router.use('/auth', auth);
export default router;

View File

@ -108,10 +108,7 @@ class RedisStore extends Store {
const key = this.prefix + sid;
this.client
.del(key)
.then((amount) => {
if (amount === 0) {
throw new Error('No such session exists');
}
.then(() => {
cb(null);
})
.catch((err) => {