コンテンツにスキップ

サーバーサイド統合

サーバーサイドモジュール(@authrim/sveltekit/server)は4つのレイヤーを提供します:

  1. createAuthHandle — セッションCookieを読み取り event.locals.auth を設定するSvelteKitハンドルフック
  2. createDirectAuthSessionHandlers — Direct Auth artifactをredeemし、HttpOnlyセッションCookieを設定する同一オリジンハンドラー
  3. ServerSessionManager — 低レベルのCookie読み書きAPI
  4. ロードヘルパー — ルート保護とデータ受け渡しのための requireAuth()createAuthLoad()

主要なサーバーフック。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[];
}

デフォルトの authMode: 'server' クライアントプロファイルでは、Direct Auth artifactをHttpOnlyアプリセッションへ交換する同一オリジンエンドポイントを作成します。

src/lib/server/authrim-handlers.ts
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,
});
HandlerMethodデフォルトルート用途
exchangePOST/authrim/session/exchangeDirect Auth artifactをredeemし、セッションCookieを設定
sessionGET/authrim/session現在のCookie-backed sessionを返す
logoutPOST/authrim/session/logoutセッションCookieをクリア

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);

event.locals.auth に設定されるデータ構造:

interface ServerAuthContext {
session: Session;
user: User;
}

SessionUser@authrim/core と同じ型です。

未認証ユーザーをログインページにリダイレクト:

src/routes/dashboard/+page.server.ts
import { requireAuth } from '@authrim/sveltekit/server';
export const load = requireAuth();

未認証の場合、/login?redirectTo=/dashboard にリダイレクトされます。

interface AuthLoadOptions {
/** ログインページURL(デフォルト: '/login') */
loginUrl?: string;
/** リターンパスのクエリパラメータ(デフォルト: 'redirectTo') */
redirectParam?: string;
}
// カスタムログインURL
export const load = requireAuth({
loginUrl: '/auth/signin',
redirectParam: 'returnTo',
});

カスタムデータとの組み合わせ

Section titled “カスタムデータとの組み合わせ”
src/routes/dashboard/+page.server.ts
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 — オプショナルな認証データ”

認証を必須にせず認証データを渡す:

src/routes/+layout.server.ts
import { createAuthLoad } from '@authrim/sveltekit/server';
export const load = createAuthLoad();
// { auth: ServerAuthContext | null } を返す

ルートレイアウトで使用し、全ページに認証データを提供します。

直接的な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;
}
src/routes/api/profile/+server.ts
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(options?)(ServerSessionManagerOptions?) → ServerSessionManager指定したCookieオプションでセッションマネージャーを作成
isAuthenticated(locals)({ auth? }) → boolean認証済みか確認
getUser(locals)({ auth? }) → User | nulllocalsからユーザーを取得
getSession(locals)({ auth? }) → Session | nulllocalsからセッションを取得
import { isAuthenticated, getUser } from '@authrim/sveltekit/server';
export const load = async ({ locals }) => {
if (isAuthenticated(locals)) {
const user = getUser(locals);
return { user };
}
return { user: null };
};
オプションデフォルト説明
cookieName'authrim_session'Cookie名
sameSite'lax'SameSite属性
securetrue(本番)HTTPSのみ
path'/'Cookieパス
maxAge604800(7日)有効期限(秒)
httpOnlytrueJavaScriptからアクセス不可
sessionSecretセッションCookieの暗号化・認証に必須