Quantcast
Channel: Active questions tagged svelte - Stack Overflow
Viewing all articles
Browse latest Browse all 1541

hooks.server and page.server authentication infinite loop

$
0
0

I am facing a problem with an infinite loop in my authentication process. I have a separate login system from my main page, which redirects to the /auth/callback path sending a token via URL parameters when the user logs in successfully. In this callback path, I have a +page.server.js file that receives the token and performs a validation via a request to an internal API. If the validation is successful, the session is stored in a cookie and the user is redirected to the home page (/).

On the other hand, in my hooks.server.js, the existence of this cookie is validated and, if it does not exist, the user is redirected to the login page. However, when I try to access my page, it redirects me to the login. When I successfully log in and return to the /auth/callback path, an infinite loop occurs, repeatedly redirecting me to login and back to callback without stopping. Interestingly, when I directly access my home page via the URL, the loop does not occur.

Based on the logs I've reviewed, it appears that the +page.server.js code is executing twice, while the hooks.server.js is executing once. Even though the cookie is copied correctly, the loop never stops, I don't know why this is happening or if I'm missing some settings.

Execution logs

cookie savedredirecting to logincookie savedcookie savedredirecting to logincookie savedcookie savedredirecting to login

hooks.server.js

import { LOGIN_URL } from '$env/static/private';import { redirect } from '@sveltejs/kit';import cookie from 'cookie';export const handle = async ({ event, resolve }) => {    const requestedPath = event.url.pathname;    const host = event.url.host;    const publicPaths = ['/auth/callback', '/auth/logout'];    if (publicPaths.includes(requestedPath)) {        return resolve(event);    }    const cookies = cookie.parse(event.request.headers.get('cookie') || '');    const email = cookies.email;    if (!email) {        console.log("redirecting to login");        throw redirect(303, `${LOGIN_URL}?srv=${host}/auth/callback`);    }    return await resolve(event);};

+page.server.js

import { validateToken } from '../../../lib/auth';import { redirect } from '@sveltejs/kit';import { LOGIN_URL } from '$env/static/private';export const load = async ({ url, cookies }) => {    const token = url.searchParams.get('apiToken');    if (token) {        const { success, data, error } = await validateToken(token);        if (!success) {            throw redirect(303, `${LOGIN_URL}/error?type=AuthError`);        }        const email = data.data.email;        cookies.set('email', email, {            httpOnly: true,            secure: false,            sameSite: 'strict',            maxAge: 86400 * 1,            path: '/'        });        console.log("cookie saved");        throw redirect(303, '/');    } else {        throw redirect(303, `${LOGIN_URL}/error?type=AuthError`);    }};

I hope that when I receive my token in the path /auth/callback the session starts correctly and does not remain in an infinite loop of redirections.


Viewing all articles
Browse latest Browse all 1541

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>