@@ -149,19 +149,23 @@ app.use((req, res, next) => {
149149const isSafeRedirect = ( url ) => / ^ \/ [ a - z A - Z 0 - 9 / _ - ] * $ / . test ( url ) ;
150150app . use ( ( req , res , next ) => {
151151 // After successful login, redirect back to the intended page
152- if ( ! req . user && req . path !== '/login' && req . path !== '/signup' && ! req . path . match ( / ^ \/ a u t h / ) && ! req . path . match ( / \. / ) ) {
152+ if ( ! req . user && req . path !== '/login' && req . path !== '/signup' && ! req . path . startsWith ( '/ auth' ) && ! req . path . includes ( '.' ) ) {
153153 const returnTo = req . originalUrl ;
154154 if ( isSafeRedirect ( returnTo ) ) {
155155 req . session . returnTo = returnTo ;
156156 } else {
157157 req . session . returnTo = '/' ;
158158 }
159- } else if ( req . user && ( req . path === '/account' || req . path . match ( / ^ \/ a p i / ) ) ) {
159+ } else if ( req . user && ( req . path === '/account' || req . path . startsWith ( '/ api' ) ) ) {
160160 const returnTo = req . originalUrl ;
161161 if ( isSafeRedirect ( returnTo ) ) {
162162 req . session . returnTo = returnTo ;
163+ if ( req . path . startsWith ( '/api/' ) && ! req . session . baseReturnTo ) {
164+ req . session . baseReturnTo = '/api' ;
165+ }
163166 } else {
164167 req . session . returnTo = '/' ;
168+ req . session . baseReturnTo = '/' ;
165169 }
166170 }
167171 next ( ) ;
@@ -268,14 +272,15 @@ app.get('/auth/failure', (req, res) => {
268272 if ( ! hasErrorFlash ) {
269273 req . flash ( 'errors' , { msg : 'Authentication failed or provider account is already linked.' } ) ;
270274 }
271- const { returnTo } = req . session ;
275+ const { returnTo, baseReturnTo } = req . session ;
272276 req . session . returnTo = undefined ;
273- // Prevent infinite loop: if returnTo is the current URL or an /auth/ route, redirect to /
274- if ( ! returnTo || ! isSafeRedirect ( returnTo ) || returnTo === req . originalUrl || / ^ \/ a u t h \/ / . test ( returnTo ) ) {
277+ req . session . baseReturnTo = undefined ;
278+ const redirectTarget = baseReturnTo || returnTo ;
279+
280+ if ( ! redirectTarget || ! isSafeRedirect ( redirectTarget ) || redirectTarget === req . originalUrl || redirectTarget . startsWith ( '/auth/' ) ) {
275281 res . redirect ( '/' ) ;
276- } else {
277- res . redirect ( returnTo ) ;
278282 }
283+ res . redirect ( redirectTarget ) ;
279284} ) ;
280285
281286/**
0 commit comments