From 038cb8b6e12f4ea9c82db6391cff8b4d4b58d8a1 Mon Sep 17 00:00:00 2001 From: HF Date: Tue, 21 Jun 2022 01:46:35 +0200 Subject: [PATCH] refactor passport --- src/core/passport.js | 4 +- src/routes/api/auth/index.js | 274 +++++++++++++++++++---------------- src/routes/api/index.js | 2 +- src/utils/connectRedis.js | 5 +- 4 files changed, 151 insertions(+), 134 deletions(-) diff --git a/src/core/passport.js b/src/core/passport.js index 9300375..6e98ea7 100644 --- a/src/core/passport.js +++ b/src/core/passport.js @@ -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(); diff --git a/src/routes/api/auth/index.js b/src/routes/api/auth/index.js index 6829754..9e8e015 100644 --- a/src/routes/api/auth/index.js +++ b/src/routes/api/auth/index.js @@ -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; diff --git a/src/routes/api/index.js b/src/routes/api/index.js index ffbd8a9..c1b4c77 100644 --- a/src/routes/api/index.js +++ b/src/routes/api/index.js @@ -85,6 +85,6 @@ router.get('/chathistory', chatHistory); router.get('/me', me); -router.use('/auth', auth(passport)); +router.use('/auth', auth); export default router; diff --git a/src/utils/connectRedis.js b/src/utils/connectRedis.js index c1ca026..b0dc43a 100644 --- a/src/utils/connectRedis.js +++ b/src/utils/connectRedis.js @@ -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) => {