サーバーサイド統合
サーバーサイドモジュール(@authrim/sveltekit/server)は4つのレイヤーを提供します:
createAuthHandle— セッションCookieを読み取りevent.locals.authを設定するSvelteKitハンドルフックcreateDirectAuthSessionHandlers— Direct Auth artifactをredeemし、HttpOnlyセッションCookieを設定する同一オリジンハンドラーServerSessionManager— 低レベルのCookie読み書きAPI- ロードヘルパー — ルート保護とデータ受け渡しのための
requireAuth()とcreateAuthLoad()
createAuthHandle
Section titled “createAuthHandle”主要なサーバーフック。src/hooks.server.ts に追加します:
import { createAuthHandle } from '@authrim/sveltekit/server';import { AUTHRIM_SESSION_SECRET } from '$env/static/private';
export const handle = createAuthHandle({ sessionSecret: AUTHRIM_SESSION_SECRET,});リクエストごとにセッションCookieを読み取り、ServerAuthContext をデシリアライズして event.locals.auth に設定します。
暗号化されたセッションCookieを読み取るには sessionSecret が必要です。32バイト以上の高エントロピーなサーバー専用secretを使用してください。
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; /** 暗号化/署名されたセッションCookie用secret */ sessionSecret?: string | Uint8Array | CryptoKey; /** コールバックURLパス(デフォルト: ['/auth/callback']) */ callbackPaths?: string[];}Direct Auth Session Handlers
Section titled “Direct Auth Session Handlers”デフォルトの authMode: 'server' クライアントプロファイルでは、Direct Auth artifactをHttpOnlyアプリセッションへ交換する同一オリジンエンドポイントを作成します。
import { createDirectAuthSessionHandlers } from '@authrim/sveltekit/server';import { PUBLIC_AUTHRIM_ISSUER, PUBLIC_AUTHRIM_CLIENT_ID } from '$env/static/public';import { AUTHRIM_SESSION_SECRET } from '$env/static/private';
export const authrimHandlers = createDirectAuthSessionHandlers({ issuer: PUBLIC_AUTHRIM_ISSUER, clientId: PUBLIC_AUTHRIM_CLIENT_ID, sessionSecret: AUTHRIM_SESSION_SECRET,});| Handler | Method | デフォルトルート | 用途 |
|---|---|---|---|
exchange | POST | /authrim/session/exchange | Direct Auth artifactをredeemし、セッションCookieを設定 |
session | GET | /authrim/session | 現在のCookie-backed sessionを返す |
logout | POST | /authrim/session/logout | セッションCookieをクリア |
他のフックとの組み合わせ
Section titled “他のフックとの組み合わせ”SvelteKitの sequence() で複数フックを合成:
import { sequence } from '@sveltejs/kit/hooks';import { createAuthHandle } from '@authrim/sveltekit/server';import { AUTHRIM_SESSION_SECRET } from '$env/static/private';
const authHandle = createAuthHandle({ sessionSecret: AUTHRIM_SESSION_SECRET,});
const loggingHandle = async ({ event, resolve }) => { console.log(`${event.request.method} ${event.url.pathname}`); return resolve(event);};
export const handle = sequence(authHandle, loggingHandle);ServerAuthContext
Section titled “ServerAuthContext”event.locals.auth に設定されるデータ構造:
interface ServerAuthContext { session: Session; user: User;}Session と User は @authrim/core と同じ型です。
ロードヘルパー
Section titled “ロードヘルパー”requireAuth — 保護ルート
Section titled “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',});カスタムデータとの組み合わせ
Section titled “カスタムデータとの組み合わせ”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 — オプショナルな認証データ
Section titled “createAuthLoad — オプショナルな認証データ”認証を必須にせず認証データを渡す:
import { createAuthLoad } from '@authrim/sveltekit/server';
export const load = createAuthLoad();// { auth: ServerAuthContext | null } を返すルートレイアウトで使用し、全ページに認証データを提供します。
ServerSessionManager
Section titled “ServerSessionManager”直接的なCookie操作(上級者向け):
import { createServerSessionManager, type ServerSessionManager,} from '@authrim/sveltekit/server';
const sessionManager = createServerSessionManager({ cookieName: 'authrim_session', sameSite: 'lax', secure: true, httpOnly: true, maxAge: 604800, sessionSecret: process.env.AUTHRIM_SESSION_SECRET,});interface ServerSessionManager { /** Cookieからセッションを読み取り */ get(event: RequestEvent): Promise<ServerAuthContext | null>; /** セッションをCookieに書き込み */ set(event: RequestEvent, context: ServerAuthContext): Promise<void>; /** セッションCookieを削除 */ clear(event: RequestEvent): void;}APIルートでの使用
Section titled “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 });}ユーティリティ関数
Section titled “ユーティリティ関数”| 関数 | シグネチャ | 用途 |
|---|---|---|
getAuthFromEvent(event) | (RequestEvent) → ServerAuthContext | null | イベントから認証情報を取得 |
getServerSessionManager(options?) | (ServerSessionManagerOptions?) → ServerSessionManager | 指定したCookieオプションでセッションマネージャーを作成 |
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設定リファレンス
Section titled “Cookie設定リファレンス”| オプション | デフォルト | 説明 |
|---|---|---|
cookieName | 'authrim_session' | Cookie名 |
sameSite | 'lax' | SameSite属性 |
secure | true(本番) | HTTPSのみ |
path | '/' | Cookieパス |
maxAge | 604800(7日) | 有効期限(秒) |
httpOnly | true | JavaScriptからアクセス不可 |
sessionSecret | — | セッションCookieの暗号化・認証に必須 |
次のステップ
Section titled “次のステップ”- 認証 — クライアントサイドの認証方式
- ストア & イベント — リアクティブな状態管理
- コンポーネント — AuthProvider等のコンポーネント