
🔐 認証を正しく構築しながら学べる。Hono、Turso、PBKDF2、JWTデュアルトークンセッションを備えた、Cloudflare Workers向けの拡張可能で標準準拠のリファレンス実装。
デモに関する注意: ログインエンドポイントは適応型PoWチャレンジによって保護されています。失敗を繰り返すと、proof-of-workの難易度が段階的に上がります。キャッシュバック型のレート制限は実装・テスト済みですが、現在ライブデモでは有効化されていません。
app.tsのcreateCacheClientを切り替えると有効化できます。
これは、Cloudflare Workers向けにスクラッチから構築した認証リファレンス実装です。PBKDF2パスワードハッシュ、JWTデュアルトークンセッション、定数時間比較、スライディング有効期限、そして削除可能なオブザーバビリティプラグインを、Hono、Turso(オプションのValkey/Redisキャッシュ付き)、および厳格なTypeScriptで結線しています。
すべての設計判断は標準規格に遡ることができます。認証情報はNIST SP 800-63B、鍵導出はNIST SP 800-132、検証はOWASP ASVS、JWTのベストプラクティスはRFC 8725です。
製品をリリースしますか? 代わりに**Better Auth**を使用してください。OAuth、パスキー、MFA、レート制限などを、活発なプラグインエコシステムとともにすぐに利用できます。このリポジトリは、認証がどのように機能するかを教えるためのものであり、本番ライブラリの代替ではありません。
このプロジェクトは、教育目的の範囲外にある機能を意図的に省略しています。このコードを本番運用に向けて拡張する場合(または本番認証システムに必要なものを評価する場合)、以下の表に優先度別にギャップをまとめています。
ほとんどの実プロジェクトでは、これらを自前で構築する代わりにBetter Authを使用してください。
| 機能 | 重要な理由 | 標準 / リファレンス |
|---|---|---|
| 流出パスワードチェック | 公知の流出データベースに含まれることが判明しているパスワードの使用を防ぎます | NIST SP 800-63B §5.1.1.2、HIBP API |
これらはすべて、代わりにBetter Authを選ぶ優れた理由です。
.
├── apps/
│ └── cloudflare-workers/ # Example Worker + Hono routes
├── packages/
│ ├── core/ # Auth services, middleware, crypto utilities
│ ├── infrastructure/ # DB client + utilities
│ ├── observability/ # Event emission, adaptive challenges, ops API (removable plugin)
│ ├── schemas/ # Zod schemas
│ └── types/ # Shared TypeScript types
├── tools/
│ └── cli/ # plctl — Go TUI for the /ops surface
└── docs/
├── adr/ # Architecture Decision Records
└── audits/ # Security audits
git clone https://github.com/vhscom/private-landing.git
cd private-landing
bun install
bun run dev
これだけです。アカウントもAPIキーも.envファイルも不要です。開発サーバーはローカルSQLiteデータベースと生成されたシークレットで起動します。http://localhost:8788を開いてアカウントを登録し、認証フローを試してみてください。
Tursoアカウントをお持ちですか?
apps/cloudflare-workers/に.dev.varsファイルを置くと(.dev.vars.exampleを参照)、bun run devがリモートデータベースでwranglerを自動的に使用します。bun run dev:localを使用すると、いずれの場合もローカルサーバーを強制できます。
テストおよびデプロイの手順についてはCONTRIBUTING.mdを参照してください。
このリポジトリには、AIアシスタントにコンテキストを提供するCLAUDE.mdファイルが含まれています。Claude Code、Cursor、または類似のAI搭載開発ツールを使用する場合:
CLAUDE.mdを自動的に読み取りますdocs/adr/のアーキテクチャ決定記録(ADR)が設計上の選択を説明しますdocs/audits/のセキュリティ監査がセキュリティ態勢を文書化しますコードベースは、明確なモジュール境界、包括的な型、説明的な命名により、AIが読み取りやすいように設計されています。
| レイヤー | 機能 |
|---|
| パスワード保存 | 128ビットソルト、整合性ダイジェスト、バージョン追跡を備えたPBKDF2-SHA384(password-service.ts) |
| セッション管理 | デバイス追跡、スライディング有効期限、ユーザーあたり最大3セッションの制限を備えたサーバーサイドセッション。Valkey/Redisによるオプションのキャッシュバック型セッション(session-service.ts、cached-session-service.ts) |
| パスワード変更 | 現在のパスワードの再検証、完全なPBKDF2再ハッシュ、全セッションのアトミックな失効(account-service.ts、ADR-004) |
| JWTデュアルトークンパターン | 15分のアクセストークン+7日のリフレッシュトークン。失効のためにセッションにリンク(token-service.ts) |
| 認証ミドルウェア | 自動リフレッシュフロー、明示的なHS256固定、typクレーム検証(require-auth.ts) |
| セキュアクッキー | HttpOnly、Secure、SameSite=Strict、Path=/(cookie.ts) |
| セキュリティヘッダー | HSTS、CSP、CORP/COEP/COOP、Permissions-Policy、フィンガープリント除去(security.ts) |
| 入力検証 | NIST準拠のパスワードポリシー(長さのみ、複雑性ルールなし)を備えたZodスキーマ |
| レート制限 | ブルートフォースおよびクレデンシャルスタッフィング攻撃に対する固定ウィンドウスロットリング。公開認証ルート(例: ログイン)ではIPキー、保護されたアクションではユーザーキー。ハードロックアウトなし(NIST準拠)(ADR-006) |
| オブザーバビリティプラグイン | 構造化セキュリティイベント、適応型PoWチャレンジ、エージェント認証付き/ops API — ミドルウェア経由でプラグインでき、1つのパッケージを削除するだけで取り外せます(ADR-008) |
| CLIツール | /opsインターフェース経由でイベントの照会、セッション管理、エージェント認証情報のプロビジョニングを行うGo TUI(plctl)(tools/cli/) |
| 攻撃ベクトルテスト | JWT改ざん、アルゴリズム混同、型混同、Unicodeのエッジケース、情報漏洩チェック |
| 機能 | 重要な理由 | 標準 / リファレンス |
|---|
| CSRF保護(SameSiteを緩和する場合) | 現在はSameSite=StrictがCSRFを防いでいます。UXのためにLaxに変更する場合、明示的なトークンが必要です | OWASP CSRFチートシート |
| リフレッシュトークンのローテーション | トークン盗難を検出します。ローテーションで置き換えられたリフレッシュトークンが再利用された場合、セッションファミリー全体を失効させます | RFC 6819 §5.2.2.3 |
JWTのaudクレーム | 同じシークレットを共有する別のサービスがトークンを受け入れることを防ぎます | RFC 7519 §4.1.3、RFC 8725 §3.9 |
| インラインスクリプト用のCSP nonce | 現在のCSPは'unsafe-inline'を使用しています。nonceを使用するとインラインスクリプトのXSSベクトルを排除できます | MDN CSP script-src |
| 機能 | 重要な理由 | 標準 / リファレンス |
|---|
| TOTP多要素認証 | 高価値アカウントに第二要素を追加します | RFC 6238、NIST SP 800-63B §5.1.4 |
| WebAuthn / パスキー | プラットフォームオーセンティケーターを使用したフィッシング耐性のある認証 | WebAuthn Level 2 |
| OAuth / ソーシャルログイン | 摩擦を減らし、パスワード疲れを回避します | RFC 6749 |
| マジックリンク / OTP | 低リスクフロー向けのパスワードレスオプション | NIST SP 800-63B §5.1.3 |
| セッション分析 | デバイス追跡、同時セッションの可視化、異常検出 | OWASPセッション管理チートシート |
| 署名鍵のローテーション | すべてのセッションを無効化せずに定期的なシークレットローテーションを可能にします | RFC 7517 (JWK) |
| 機能 | 重要な理由 | 標準 / リファレンス |
|---|
| DPoP / トークンバインディング | トークンをクライアントのTLS接続にバインドし、外部流出したトークンの再利用を防ぎます | RFC 9449 (DPoP) |
| マルチテナンシー | テナントごとにユーザープール、シークレット、ポリシーを分離します | アプリケーション固有 |
| ジオフェンシング / IPレピュテーション | 予期しない地域や既知の悪質IPからのログインをブロックします | OWASP ASVS v5.0 §6.3.5 |
| 適応型認証 | リスクシグナル(デバイス、場所、行動)に基づいて認証要件を強化します | NIST SP 800-63B §6 |
| PBKDF2反復回数の引き上げまたはArgon2id | OWASPはPBKDF2-SHA512の210,000回の反復を推奨しています(Cloudflareでは100,000回に制限)。Argon2idはメモリハードです | OWASPパスワード保存チートシート |