サンプルアプリ
概要
example-sveltekit プロジェクトは @authrim/sveltekit の完全な動作デモです。SvelteKit 2 と Svelte 5 で構築され、主要な認証フロー(Passkey、Email Code、ソーシャルログイン)に加え、サーバーサイドセッション管理、保護ルート、UIコンポーネントライブラリの実装を紹介します。
ソースコード: github.com/authrim/example-sveltekit
プロジェクト構成
example-sveltekit/├── src/│ ├── app.d.ts # TypeScriptグローバル型定義│ ├── app.html # HTMLテンプレート│ ├── hooks.server.ts # サーバー認証ハンドラー│ ├── lib/│ │ ├── auth.ts # Authrimクライアント(シングルトン)│ │ └── config.ts # 環境設定│ └── routes/│ ├── +layout.svelte # ルートレイアウト(AuthProvider)│ ├── +layout.server.ts # サーバーサイド認証データ│ ├── +page.svelte # ホームページ│ ├── login/│ │ └── +page.svelte # ログインページ│ ├── signup/│ │ └── +page.svelte # サインアップページ│ ├── callback/│ │ └── +page.svelte # OAuthコールバックハンドラー│ └── account/│ ├── +page.svelte # アカウント設定(保護ページ)│ └── +page.server.ts # 認証ガード├── .env.example # 環境変数テンプレート├── svelte.config.js # SvelteKit設定(Cloudflareアダプター)├── vite.config.ts # Vite設定└── wrangler.toml # Cloudflare Pagesデプロイ設定設定
環境変数
.env.example をコピーして値を設定:
PUBLIC_AUTHRIM_ISSUER=https://your-tenant.authrim.comPUBLIC_AUTHRIM_CLIENT_ID=your-client-id管理パネルでの設定
Authrimクライアント設定に以下を登録します:
| 設定 | 値 |
|---|---|
| 許可されたリダイレクトURI | http://localhost:5173/callback |
| 許可されたオリジン | http://localhost:5173 |
主要ファイルの解説
src/lib/auth.ts — クライアントシングルトン
認証クライアントを一度だけ初期化し、アプリ全体で再利用:
import { createAuthrim, type AuthrimClient } from '@authrim/sveltekit';import { getAuthConfig } from './config.js';
let authClient: AuthrimClient | null = null;
export async function getAuth(): Promise<AuthrimClient> { if (authClient) return authClient;
const config = getAuthConfig(); authClient = await createAuthrim({ issuer: config.issuer, clientId: config.clientId, });
return authClient;}
export function clearAuth(): void { if (authClient) { authClient.destroy(); authClient = null; }}src/hooks.server.ts — サーバー認証ハンドラー
SvelteKitのhandleフックでサーバーサイドセッション管理を設定:
import { createAuthHandle } from '@authrim/sveltekit/server';import { env } from '$env/dynamic/public';
export const handle = createAuthHandle({ issuer: env.PUBLIC_AUTHRIM_ISSUER || '', clientId: env.PUBLIC_AUTHRIM_CLIENT_ID || '', callbackPaths: ['/callback'],});src/routes/+layout.server.ts — SSR用認証データ
全ページに認証データを提供:
import { createAuthLoad } from '@authrim/sveltekit/server';
export const load = createAuthLoad();src/routes/+layout.svelte — ルートレイアウト
クライアントサイドで認証クライアントを初期化し、AuthProvider で全ページをラップ:
<script lang="ts"> import { onMount } from 'svelte'; import { AuthProvider } from '@authrim/sveltekit/components'; import type { AuthrimClient } from '@authrim/sveltekit';
let { data, children } = $props();
let auth: AuthrimClient | null = $state(null); let isInitializing = $state(true);
onMount(async () => { try { const { getAuth } = await import('$lib/auth.js'); auth = await getAuth(); } catch (e) { console.error('[Authrim] Failed to initialize auth:', e); } finally { isInitializing = false; } });</script>
{#if isInitializing} <p>Loading...</p>{:else if auth} <AuthProvider {auth} initialSession={data.auth?.session ?? null} initialUser={data.auth?.user ?? null} > {@render children()} </AuthProvider>{/if}ポイント:
- SSR問題を避けるため、クライアントは
onMount内で動的インポート AuthProviderにSSRデータ(initialSession、initialUser)を渡してハイドレーション不一致を防止- 子ルートは
getAuthContext()で認証クライアントにアクセス可能
ページ別ウォークスルー
ホームページ — src/routes/+page.svelte
認証ストアを読み取って現在の状態を表示:
const { session, user, isAuthenticated, loadingState } = auth.stores;- 認証済み — ユーザーアバター、名前、メール、セッションID、セッション有効期限、アカウント設定リンクを表示
- 未認証 — ウェルカムカードとサインイン・サインアップボタンを表示
- 機能一覧 — Passkey、Email Code、ソーシャルログイン、セッション管理、Passkey管理、サーバーサイドバリデーション
ログインページ — src/routes/login/+page.svelte
3つの認証方法を提供:
Passkey(条件付きUI)
onMount(async () => { const isAvailable = await auth.passkey.isConditionalUIAvailable(); if (isAvailable) { auth.passkey.login({ conditional: true }).then((result) => { if (result.data) goto(redirectTo); }); }});ページ読み込み時に条件付きUIを開始 — ブラウザの自動入力に利用可能なPasskeyが表示されます。明示的な「Passkeyでサインイン」ボタンも利用可能。
Email Code
EmailCodeForm を使った2ステップフロー:
// ステップ1: コード送信const result = await auth.emailCode.send(email, { action: 'login' });if (!result.error) emailStep = 'code';
// ステップ2: コード検証const result = await auth.emailCode.verify(email, code);if (!result.error) goto(redirectTo);ソーシャルログイン
const result = await auth.social.loginWithPopup(provider, { redirectTo });Google、GitHub、Appleに対応。各プロバイダーはポップアップウィンドウで認証します。
サインアップページ — src/routes/signup/+page.svelte
PasskeyとEmail Codeによるマルチメソッドサインアップ:
// Passkeyサインアップconst result = await auth.passkey.signUp({ name: name.trim() });
// Email Codeサインアップconst result = await auth.emailCode.send(email, { action: 'signup', name: name.trim(),});ソーシャルサインアップは同じ auth.social.loginWithPopup() フローを使用。
コールバックページ — src/routes/callback/+page.svelte
OAuth/ソーシャルログインのコールバックを処理:
onMount(async () => { if (auth.social.hasCallbackParams()) { const result = await auth.social.handleCallback(); if (result.error) { error = result.error.message; } else { goto(result.data?.redirectTo || '/'); } }});アカウント設定 — src/routes/account/
requireAuth() による保護ルート:
import { requireAuth } from '@authrim/sveltekit/server';
export const load = requireAuth({ loginUrl: '/login', redirectParam: 'redirectTo',});未認証ユーザーは自動的に /login?redirectTo=/account にリダイレクトされます。
ページの内容:
- ユーザープロフィール(アバター、名前、メール)
- Passkey管理(登録、一覧、削除)—
PasskeyList/PasskeyRegisterButtonを使用 - セッション管理(一覧、取消)—
SessionListを使用 - サインアウトボタン
ユーザーフロー
flowchart LR
home["/
(ホーム)"]
login["/login
(ログイン)"]
signup["/signup
(サインアップ)"]
callback["/callback
(コールバック)"]
account["/account
(アカウント)"]
home -->|"未サインイン"| login
home -->|"未サインイン"| signup
login -->|"Passkey / Email Code"| home
login -->|"ソーシャルログイン"| callback --> home
signup -->|"Passkey / Email Code"| home
home -->|"アカウント設定"| account
account -->|"サインアウト"| home
使用UIコンポーネント
サンプルアプリは @authrim/sveltekit/ui のコンポーネントを使用:
| コンポーネント | 使用場所 | 用途 |
|---|---|---|
Card | Login, Signup, Home | コンテナレイアウト |
Button | 全ページ | アクション |
Input | Signup | 名前入力 |
EmailCodeForm | Login, Signup | メール + OTP 2ステップフォーム |
SocialLoginButtons | Login, Signup | プロバイダーボタン |
PasskeyConditionalInput | Login | 自動入力ベースのPasskey選択 |
OTPInput | Signup | 6桁コード入力 |
ResendCodeButton | Signup | カウントダウン付き再送信 |
PasskeyList | Account | 登録済みPasskey一覧 |
PasskeyRegisterButton | Account | 新規Passkey登録 |
SessionList | Account | アクティブセッション一覧 |
AuthError | 全ページ | エラー表示 |
Spinner | Home, Callback | ローディング表示 |
ローカルで実行する
git clone https://github.com/authrim/example-sveltekit.gitcd example-sveltekitpnpm installcp .env.example .env# .envをAuthrimテナントURLとクライアントIDで編集pnpm devブラウザで http://localhost:5173 を開きます。
Cloudflare Pagesへのデプロイ
アプリはCloudflare Pages用に設定済み:
pnpm buildnpx wrangler pages deploy .svelte-kit/cloudflareCloudflareダッシュボードで環境変数を設定:
| 変数 | 値 |
|---|---|
PUBLIC_AUTHRIM_ISSUER | https://your-tenant.authrim.com |
PUBLIC_AUTHRIM_CLIENT_ID | your-client-id |
Authrimクライアント設定で、本番URLを許可されたリダイレクトURIとオリジンに追加してください。