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 ;