サーバーサイド統合
概要
サーバーサイドモジュール(@authrim/sveltekit/server)は3つのレイヤーを提供します:
createAuthHandle— セッションCookieを読み取りevent.locals.authを設定するSvelteKitハンドルフックServerSessionManager— 低レベルのCookie読み書きAPI- ロードヘルパー — ルート保護とデータ受け渡しのための
requireAuth()とcreateAuthLoad()
createAuthHandle
主要なサーバーフック。src/hooks.server.ts に追加します:
import { createAuthHandle } from '@authrim/sveltekit/server';
export const handle = createAuthHandle();リクエストごとにセッションCookieを読み取り、ServerAuthContext をデシリアライズして event.locals.auth に設定します。
オプション
interface AuthHandleOptions { /** Cookie名(デフォルト: 'authrim_session') */ cookieName?: string; /** SameSite属性(デフォルト: 'lax') */ sameSite?: 'strict' | 'lax' | 'none'; /** Secureフラグ(デフォルト: 本番環境でtrue) */ secure?: boolean; /** Cookieパス(デフォルト: '/') */ path?: string; /** 有効期限(秒)(デフォルト: 604800 = 7日) */ maxAge?: number; /** HttpOnlyフラグ(デフォルト: true) */ httpOnly?: boolean; /** コールバックURLパス(デフォルト: ['/auth/callback']) */ callbackPaths?: string[];}他のフックとの組み合わせ
SvelteKitの sequence() で複数フックを合成:
import { sequence } from '@sveltejs/kit/hooks';import { createAuthHandle } from '@authrim/sveltekit/server';
const authHandle = createAuthHandle();
const loggingHandle = async ({ event, resolve }) => { console.log(`${event.request.method} ${event.url.pathname}`); return resolve(event);};
export const handle = sequence(authHandle, loggingHandle);ServerAuthContext
event.locals.auth に設定されるデータ構造:
interface ServerAuthContext { session: Session; user: User;}Session と User は @authrim/core と同じ型です。
ロードヘルパー
requireAuth — 保護ルート
未認証ユーザーをログインページにリダイレクト:
import { requireAuth } from '@authrim/sveltekit/server';
export const load = requireAuth();未認証の場合、/login?redirectTo=/dashboard にリダイレクトされます。
オプション
interface AuthLoadOptions { /** ログインページURL(デフォルト: '/login') */ loginUrl?: string; /** リターンパスのクエリパラメータ(デフォルト: 'redirectTo') */ redirectParam?: string;}// カスタムログインURLexport const load = requireAuth({ loginUrl: '/auth/signin', redirectParam: 'returnTo',});カスタムデータとの組み合わせ
import { requireAuth } from '@authrim/sveltekit/server';
export const load = async (event) => { // まず requireAuth() — 未認証ならリダイレクト const { auth } = await requireAuth()(event);
// 追加データの読み込み const dashboardData = await fetchDashboard(auth.user.id);
return { auth, dashboard: dashboardData, };};createAuthLoad — オプショナルな認証データ
認証を必須にせず認証データを渡す:
import { createAuthLoad } from '@authrim/sveltekit/server';
export const load = createAuthLoad();// { auth: ServerAuthContext | null } を返すルートレイアウトで使用し、全ページに認証データを提供します。
ServerSessionManager
直接的なCookie操作(上級者向け):
import { createServerSessionManager, type ServerSessionManager,} from '@authrim/sveltekit/server';
const sessionManager = createServerSessionManager({ cookieName: 'authrim_session', sameSite: 'lax', secure: true, httpOnly: true, maxAge: 604800,});API
interface ServerSessionManager { /** Cookieからセッションを読み取り */ get(event: RequestEvent): Promise<ServerAuthContext | null>; /** セッションをCookieに書き込み */ set(event: RequestEvent, context: ServerAuthContext): void; /** セッションCookieを削除 */ clear(event: RequestEvent): void;}APIルートでの使用
import { getAuthFromEvent } from '@authrim/sveltekit/server';import { json, error } from '@sveltejs/kit';
export async function GET({ locals }) { const auth = locals.auth; if (!auth) throw error(401, '認証が必要です');
return json({ user: auth.user });}ユーティリティ関数
| 関数 | シグネチャ | 用途 |
|---|---|---|
getAuthFromEvent(event) | (RequestEvent) → ServerAuthContext | null | イベントから認証情報を取得 |
getServerSessionManager(event) | (RequestEvent) → ServerSessionManager | handleから設定済みセッションマネージャーを取得 |
isAuthenticated(locals) | ({ auth? }) → boolean | 認証済みか確認 |
getUser(locals) | ({ auth? }) → User | null | localsからユーザーを取得 |
getSession(locals) | ({ auth? }) → Session | null | localsからセッションを取得 |
import { isAuthenticated, getUser } from '@authrim/sveltekit/server';
export const load = async ({ locals }) => { if (isAuthenticated(locals)) { const user = getUser(locals); return { user }; } return { user: null };};Cookie設定リファレンス
| オプション | デフォルト | 説明 |
|---|---|---|
cookieName | 'authrim_session' | Cookie名 |
sameSite | 'lax' | SameSite属性 |
secure | true(本番) | HTTPSのみ |
path | '/' | Cookieパス |
maxAge | 604800(7日) | 有効期限(秒) |
httpOnly | true | JavaScriptからアクセス不可 |
次のステップ
- 認証 — クライアントサイドの認証方式
- ストア & イベント — リアクティブな状態管理
- コンポーネント — AuthProvider等のコンポーネント