diff --git a/api-server/server/boot/authentication.js b/api-server/server/boot/authentication.js index b0276cb89c..19f01f10e6 100644 --- a/api-server/server/boot/authentication.js +++ b/api-server/server/boot/authentication.js @@ -54,8 +54,19 @@ module.exports = function enableAuthentication(app) { } else { api.get( '/signin', + (req, res, next) => { + if (req && req.query && req.query.returnTo) { + req.query.returnTo = `${homeLocation}/${req.query.returnTo}`; + } + return next(); + }, ifUserRedirect, - passport.authenticate('auth0-login', {}) + (req, res, next) => { + const state = req.query.returnTo + ? Buffer.from(req.query.returnTo).toString('base64') + : null; + return passport.authenticate('auth0-login', { state })(req, res, next); + } ); api.get( diff --git a/api-server/server/component-passport.js b/api-server/server/component-passport.js index 656697e8e9..ec6c667646 100644 --- a/api-server/server/component-passport.js +++ b/api-server/server/component-passport.js @@ -101,6 +101,10 @@ export const createPassportCallbackAuthenticator = (strategy, config) => ( res, next ) => { + const returnTo = + req && req.query && req.query.state + ? Buffer.from(req.query.state, 'base64').toString('utf-8') + : `${homeLocation}/learn`; return passport.authenticate( strategy, { session: false }, @@ -112,7 +116,7 @@ export const createPassportCallbackAuthenticator = (strategy, config) => ( if (!user || !userInfo) { return res.redirect('/signin'); } - const redirect = `${homeLocation}/learn`; + const redirect = `${returnTo}`; const { accessToken } = userInfo; const { provider } = config; diff --git a/api-server/server/passport-providers.js b/api-server/server/passport-providers.js index 1c72fc4eff..4d0dbc2ad9 100644 --- a/api-server/server/passport-providers.js +++ b/api-server/server/passport-providers.js @@ -34,6 +34,8 @@ export default { authPath: '/auth/auth0', callbackPath: '/auth/auth0/callback', useCustomCallback: true, + passReqToCallback: true, + state: false, successRedirect: successRedirect, failureRedirect: failureRedirect, scope: ['openid profile email'], diff --git a/api-server/server/utils/middleware.js b/api-server/server/utils/middleware.js index 18357497fb..da8469bc2e 100644 --- a/api-server/server/utils/middleware.js +++ b/api-server/server/utils/middleware.js @@ -56,10 +56,13 @@ export function ifNotVerifiedRedirectToUpdateEmail(req, res, next) { } export function ifUserRedirectTo(path = `${homeLocation}/`, status) { - status = status === 302 ? 302 : 301; + status = status === 301 ? 301 : 302; return (req, res, next) => { const { accessToken } = getAccessTokenFromRequest(req); if (req.user && accessToken) { + if (req.query && req.query.returnTo) { + return res.status(status).redirect(req.query.returnTo); + } return res.status(status).redirect(path); } if (req.user && !accessToken) { diff --git a/client/src/client-only-routes/ShowSettings.js b/client/src/client-only-routes/ShowSettings.js index 1cdd9f94f5..59cc00975c 100644 --- a/client/src/client-only-routes/ShowSettings.js +++ b/client/src/client-only-routes/ShowSettings.js @@ -162,7 +162,7 @@ export function ShowSettings(props) { } if (!showLoading && !isSignedIn) { - return navigate(`${apiLocation}/signin`); + return navigate(`${apiLocation}/signin?returnTo=settings`); } return ( diff --git a/client/src/client-only-routes/ShowSettings.test.js b/client/src/client-only-routes/ShowSettings.test.js index 30be96c765..c2079f001e 100644 --- a/client/src/client-only-routes/ShowSettings.test.js +++ b/client/src/client-only-routes/ShowSettings.test.js @@ -11,7 +11,9 @@ describe('', () => { const shallow = new ShallowRenderer(); shallow.render(); expect(navigate).toHaveBeenCalledTimes(1); - expect(navigate).toHaveBeenCalledWith(`${apiLocation}/signin`); + expect(navigate).toHaveBeenCalledWith( + `${apiLocation}/signin?returnTo=settings` + ); expect(true).toBeTruthy(); }); }); diff --git a/client/src/pages/donate.js b/client/src/pages/donate.js index 3c07f27e62..33833d120f 100644 --- a/client/src/pages/donate.js +++ b/client/src/pages/donate.js @@ -91,7 +91,7 @@ export class DonatePage extends Component { } if (!showLoading && !isSignedIn) { - return navigate(`${apiLocation}/signin`); + return navigate(`${apiLocation}/signin?returnTo=donate`); } return ( diff --git a/client/src/pages/donate.test.js b/client/src/pages/donate.test.js index fd4e324207..29b30f90c7 100644 --- a/client/src/pages/donate.test.js +++ b/client/src/pages/donate.test.js @@ -11,7 +11,9 @@ describe('', () => { const shallow = new ShallowRenderer(); shallow.render(); expect(navigate).toHaveBeenCalledTimes(1); - expect(navigate).toHaveBeenCalledWith(`${apiLocation}/signin`); + expect(navigate).toHaveBeenCalledWith( + `${apiLocation}/signin?returnTo=donate` + ); expect(true).toBeTruthy(); }); }); diff --git a/client/src/pages/portfolio.js b/client/src/pages/portfolio.js index a9d5f933eb..3a3651ac71 100644 --- a/client/src/pages/portfolio.js +++ b/client/src/pages/portfolio.js @@ -50,7 +50,7 @@ function ProfilePage(props) { return ; } if (!showLoading && !isSignedIn) { - return navigate(`${apiLocation}/signin`); + return navigate(`${apiLocation}/signin?returnTo=portfolio`); } const RedirecUser = createRedirect('/' + username); return ;