Implement better auth flow with direct Authentik redirects
- Create custom /login and /logout endpoints that bypass Auth.js default pages - Use auto-submitting forms to POST to Auth.js with proper form data - Update UserHeader links to use new custom endpoints (/login, /logout) - Remove old login/logout page server files that are no longer needed - Login flow: /login → auto-submit form → /auth/signin/authentik → Authentik - Logout flow: /logout → auto-submit form → /auth/signout → Authentik logout - Provides seamless user experience with loading spinners during redirects - Maintains all Auth.js security features and session management - Eliminates intermediate Auth.js pages for cleaner auth flow 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
		@@ -139,10 +139,10 @@ h2 + p{
 | 
			
		||||
			<p>({user.nickname})</p>
 | 
			
		||||
			<ul>
 | 
			
		||||
				<li><a href="https://sso.bocken.org/if/user/#/settings" >Einstellungen</a></li>
 | 
			
		||||
				<li><a href="/auth/signout" >Log Out</a></li>
 | 
			
		||||
				<li><a href="/logout" >Log Out</a></li>
 | 
			
		||||
			</ul>
 | 
			
		||||
		</div>
 | 
			
		||||
	</button>
 | 
			
		||||
{:else}
 | 
			
		||||
	<a class=entry href=/auth/signin>Log In</a>
 | 
			
		||||
	<a class=entry href=/login>Log In</a>
 | 
			
		||||
{/if}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +0,0 @@
 | 
			
		||||
import { signIn } from "../../../auth"
 | 
			
		||||
import type { Actions } from "./$types"
 | 
			
		||||
export const actions: Actions = { default: signIn }
 | 
			
		||||
@@ -1,3 +0,0 @@
 | 
			
		||||
import { signIn } from "../../../auth"
 | 
			
		||||
import type { Actions } from "./$types"
 | 
			
		||||
export const actions: Actions = { default: signIn }
 | 
			
		||||
							
								
								
									
										35
									
								
								src/routes/login/+server.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								src/routes/login/+server.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,35 @@
 | 
			
		||||
import type { RequestHandler } from './$types';
 | 
			
		||||
 | 
			
		||||
export const GET: RequestHandler = async ({ url }) => {
 | 
			
		||||
	const callbackUrl = url.searchParams.get('callbackUrl') || '/';
 | 
			
		||||
	
 | 
			
		||||
	// Create an auto-submitting form that POSTs to Auth.js signin
 | 
			
		||||
	const html = `
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html>
 | 
			
		||||
<head>
 | 
			
		||||
	<title>Redirecting to login...</title>
 | 
			
		||||
	<style>
 | 
			
		||||
		body { font-family: system-ui; text-align: center; padding: 2rem; }
 | 
			
		||||
		.spinner { border: 4px solid #f3f3f3; border-top: 4px solid #3498db; border-radius: 50%; width: 40px; height: 40px; animation: spin 1s linear infinite; margin: 20px auto; }
 | 
			
		||||
		@keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }
 | 
			
		||||
	</style>
 | 
			
		||||
</head>
 | 
			
		||||
<body>
 | 
			
		||||
	<h2>Redirecting to login...</h2>
 | 
			
		||||
	<div class="spinner"></div>
 | 
			
		||||
	<form id="signin-form" method="POST" action="/auth/signin/authentik">
 | 
			
		||||
		<input type="hidden" name="callbackUrl" value="${callbackUrl}" />
 | 
			
		||||
	</form>
 | 
			
		||||
	<script>
 | 
			
		||||
		document.getElementById('signin-form').submit();
 | 
			
		||||
	</script>
 | 
			
		||||
</body>
 | 
			
		||||
</html>`;
 | 
			
		||||
 | 
			
		||||
	return new Response(html, {
 | 
			
		||||
		headers: {
 | 
			
		||||
			'Content-Type': 'text/html'
 | 
			
		||||
		}
 | 
			
		||||
	});
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										35
									
								
								src/routes/logout/+server.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								src/routes/logout/+server.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,35 @@
 | 
			
		||||
import type { RequestHandler } from './$types';
 | 
			
		||||
 | 
			
		||||
export const GET: RequestHandler = async ({ url }) => {
 | 
			
		||||
	const callbackUrl = url.searchParams.get('callbackUrl') || '/';
 | 
			
		||||
	
 | 
			
		||||
	// Create an auto-submitting form that POSTs to Auth.js signout
 | 
			
		||||
	const html = `
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html>
 | 
			
		||||
<head>
 | 
			
		||||
	<title>Signing out...</title>
 | 
			
		||||
	<style>
 | 
			
		||||
		body { font-family: system-ui; text-align: center; padding: 2rem; }
 | 
			
		||||
		.spinner { border: 4px solid #f3f3f3; border-top: 4px solid #3498db; border-radius: 50%; width: 40px; height: 40px; animation: spin 1s linear infinite; margin: 20px auto; }
 | 
			
		||||
		@keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }
 | 
			
		||||
	</style>
 | 
			
		||||
</head>
 | 
			
		||||
<body>
 | 
			
		||||
	<h2>Signing out...</h2>
 | 
			
		||||
	<div class="spinner"></div>
 | 
			
		||||
	<form id="signout-form" method="POST" action="/auth/signout">
 | 
			
		||||
		<input type="hidden" name="callbackUrl" value="${callbackUrl}" />
 | 
			
		||||
	</form>
 | 
			
		||||
	<script>
 | 
			
		||||
		document.getElementById('signout-form').submit();
 | 
			
		||||
	</script>
 | 
			
		||||
</body>
 | 
			
		||||
</html>`;
 | 
			
		||||
 | 
			
		||||
	return new Response(html, {
 | 
			
		||||
		headers: {
 | 
			
		||||
			'Content-Type': 'text/html'
 | 
			
		||||
		}
 | 
			
		||||
	});
 | 
			
		||||
};
 | 
			
		||||
		Reference in New Issue
	
	Block a user