Tovább a tartalomhoz

Autentikáció

Az ElyOS a better-auth könyvtárat használja autentikációhoz. Támogatott módszerek:

  • Email + jelszó
  • Email OTP (egyszeri kód)
  • Google OAuth
  • Kétfaktoros hitelesítés (TOTP + backup kódok)

A session adatok a locals objektumon keresztül érhetők el minden szerver oldali kódban:

// *.remote.ts fájlban
import { command, getRequestEvent } from '$app/server';
export const myAction = command(schema, async (input) => {
const { locals } = getRequestEvent();
// Bejelentkezett felhasználó
const user = locals.user; // User | null
const session = locals.session; // Session | null
if (!user) {
return { success: false, error: 'Hitelesítés szükséges' };
}
console.log(user.id); // string
console.log(user.email); // string
console.log(user.name); // string
});

Az app.d.ts-ben definiált interfész:

interface Locals {
user: import('better-auth').User | null;
session: import('better-auth').Session | null;
settings: UserSettings; // Felhasználói beállítások
locale: string; // Aktuális nyelv
}

A session adatok a layout +layout.server.ts-ből töltődnek be és a $page.data-n keresztül érhetők el:

<script lang="ts">
import { page } from '$app/stores';
const user = $derived($page.data.user);
</script>
{#if user}
<p>Üdv, {user.name}!</p>
{/if}

A hooks.server.ts kezeli az autentikációt és az átirányításokat. A védett útvonalak az admin/(protected)/ csoportban vannak — ezekre csak bejelentkezett felhasználók léphetnek be.

Ha saját ellenőrzést szeretnél egy route-ban:

+page.server.ts
import { redirect } from '@sveltejs/kit';
import type { PageServerLoad } from './$types';
export const load: PageServerLoad = async ({ locals }) => {
if (!locals.user) {
redirect(302, '/admin/login');
}
return { user: locals.user };
};
import { command, getRequestEvent } from '$app/server';
import { permissionRepository } from '$lib/server/database/repositories';
export const adminAction = command(schema, async (input) => {
const { locals } = getRequestEvent();
if (!locals.user?.id) {
return { success: false, error: 'Hitelesítés szükséges' };
}
const userId = parseInt(locals.user.id);
// Jogosultság ellenőrzése
const hasPermission = await permissionRepository.userHasPermission(
userId,
'admin'
);
if (!hasPermission) {
return { success: false, error: 'Nincs jogosultság' };
}
// ...
});

A kliens oldali auth műveletek a $lib/auth modulból érhetők el:

import { authClient } from '$lib/auth';
// Bejelentkezés
await authClient.signIn.email({
email: 'user@example.com',
password: 'jelszó'
});
// Kijelentkezés
await authClient.signOut();
// Jelszó módosítás
await authClient.changePassword({
currentPassword: 'régi',
newPassword: 'új'
});

A 2FA TOTP alapú, felhasználónként a Beállítások alkalmazásban kapcsolható be. Nincs szükség szerver oldali konfigurációra — a better-auth kezeli.

A hooks.server.ts inicializálja az autentikációt minden kérésnél:

// hooks.server.ts (részlet)
import { auth } from '$lib/auth/index';
import { svelteKitHandler } from 'better-auth/svelte-kit';
export const handle: Handle = async ({ event, resolve }) => {
// better-auth kezeli az auth route-okat (/api/auth/*)
return svelteKitHandler({ event, resolve, auth });
};
VáltozóLeírás
BETTER_AUTH_SECRETToken aláíró titok (openssl rand -base64 32)
BETTER_AUTH_URLAuth callback alap URL (meg kell egyeznie az APP_URL-lel)
ORIGINCSRF védelem — az alkalmazás publikus URL-je
REGISTRATION_ENABLEDRegisztráció engedélyezése (true/false)
GOOGLE_CLIENT_IDGoogle OAuth kliens azonosító
GOOGLE_CLIENT_SECRETGoogle OAuth kliens titok

Az ElyOS felhasználónként csak egy aktív munkamenetet engedélyez. Új bejelentkezéskor a korábbi munkamenet automatikusan érvénytelenítődik.