この記事のまとめ
2026年のAstro開発において、自前DB(PostgreSQL/SQLite等)を活用した認証を実装するならBetter-Authが最強の選択肢です。
- • Lucia Authの非推奨化(2025年)に伴う、最も有力な移行先
- • TypeScript-first設計で、セッションやユーザーの型推論が完璧
- • Astro 5の新機能「Server Islands」に完全対応。動的なUIもサクサク
- • 2FA、パスキー、組織管理(Multi-tenancy)などのプラグインが豊富
はじめに
2025年から2026年にかけて、JavaScript/TypeScriptエコシステムの認証ライブラリには大きな変化がありました。長らく愛されてきた Lucia Auth が教育的リソースへと舵を切り、新規プロジェクトでの利用が非推奨となったのです。
その空白を埋める、あるいはそれ以上の体験を提供する「Astro時代の決定版」として君臨したのが、この Better-Auth です。
1. なぜBetter-Authなのか?
これまでAstroの認証は、Auth.js(旧NextAuth)のプラグインを使うか、Luciaでゴリゴリ自作するかの二択でした。前者はカスタマイズが難しく、後者は実装コストが高いという課題がありました。
Better-Authはその中間に位置し、 「設定の簡単さ」と「詳細なコントロール」を両立 しています。
Lucia Authは2025年3月をもって、教育的リソースとしてのメンテナンスに移行しました。現在、Luciaの開発者自身もBetter-Authを含む後継ライブラリへの移行を模索することを推奨しています。
Better-Authは、最初からAstroを第一級市民として扱っています。
2. Better-Authの主要機能とAstroへの恩恵
① 圧倒的な型安全性
TypeScript-firstで設計されているため、データベースにカスタムフィールドを追加しても、クライアントサイド・サーバーサイドの両方で自動的に型が推論されます。
② Server Islandsとの完璧な相性
Astro 5で導入された Server Islands 。静的なページの中に「ログイン中か」といった動的なパーツを埋め込む際、Better-Authはサーバーサイドのセッションを即座に解決できるため、ロード時間を最小限に抑えられます。
③ プラグイン一つで高度な機能
これまで実装に数日かかっていた機能が、数行の設定で追加できます。
- 2FA (二要素認証) : TOTPなどを即座に導入。
- Multi-tenancy : 組織(Teams/Organizations)の概念を標準サポート。
- Passkeys : 生体認証によるパスワードレスログイン。
3. 他の認証手法との比較
「ClerkやKindeなどのManaged Authで十分じゃないか?」という声もあります。 しかし、Better-Authを選ぶ最大の理由は 「データの所有権」と「コスト」 です。
| 比較項目 | Better-Auth | Auth.js (NextAuth) | Clerk |
|---|---|---|---|
| データの保存場所 | 自前DB (Postgres等) | 自前DB | Clerkクラウド |
| 実装の難易度 | 中 (設定は簡単) | 中 (ドキュメントが複雑) | 低 (コピペで動く) |
| 型安全性 | ◎ (TypeScript First) | △ (設定による) | ◎ (SDKが優秀) |
| コスト | サーバー代のみ | サーバー代のみ | 月間アクティブユーザー課金 |
| Astro対応 | ◎ (Server Islands完璧) | ○ (アダプターあり) | △ (Middleware必須) |
「ユーザーデータを自分で持ちたいか?」 が最大の分かれ目です。将来的に他サービスへ移行する可能性があるなら、Better-Authで自前DBに保存しておくのが最もロックインリスクが低いです。
4. Better-AuthをAstroに導入する (クイックガイド)
Dreams of Codeによる詳細なチュートリアル動画(2025年版)が非常に参考になります。
導入の基本的な流れは以下の通りです。
- ライブラリのインストール
better-auth本体と、Astro用プラグイン(必要な場合)を導入します。
npm install better-auth drizzle-orm @libsql/client
- 認証クライアントの作成 (
lib/auth.ts) ミニマムな設定例です。GitHub認証とユーザー名/パスワード認証を有効にしています。
import { betterAuth } from "better-auth";
import { drizzleAdapter } from "better-auth/adapters/drizzle";
import { db } from "./db"; // Drizzleインスタンス
export const auth = betterAuth({
database: drizzleAdapter(db, {
provider: "sqlite, // or 'pg', 'mysql",
}),
emailAndPassword: {
enabled: true,
},
socialProviders: {
github: {
clientId: process.env.GITHUB_CLIENT_ID,
clientSecret: process.env.GITHUB_CLIENT_SECRET,
},
google: {
clientId: process.env.GOOGLE_CLIENT_ID,
clientSecret: process.env.GOOGLE_CLIENT_SECRET,
},
},
});
- APIルートの作成 (
pages/api/auth/[...all].ts) Better-Authは独自のAPIエンドポイントを自動生成します。AstroのAPIルートでリクエストをハンドリングします。
import { auth } from "../../../lib/auth";
import type { APIRoute } from "astro";
export const ALL: APIRoute = async (ctx) => {
return auth.handler(ctx.request);
};
- ページからの利用 (Server Islands)
.astroファイル内でサーバーサイドセッションを取得します。Server Islandsを使えば、この部分だけを動的にロードできます。
---
import { auth } from "@/lib/auth";
const session = await auth.api.getSession({
headers: Astro.request.headers,
});
---
{session ? (
<p>ようこそ、{session.user.name}さん!</p>
) : (
<a href="/login">ログイン</a>
)}
5. 認証フローの全体像 (Mermaid)
ユーザーがログインしてから、セッションが確立されるまでの流れを可視化しました。
6. Lucia Authからの移行ガイド
Luciaを使っていた開発者にとって、Better-Authへの移行は比較的スムーズです。
- スキーマ :
userテーブルとsessionテーブルの構造は似ていますが、Better-Authはより多くのフィールド(createdAt,updatedAtなど)をデフォルトで管理します。 - アダプター : DrizzleやPrismaのアダプターはLucia同様に使えます。
- 書き方 :
Lucia.validateSession()がauth.api.getSession()に変わるイメージです。ただし、Better-AuthはAPIエンドポイントを内包しているため、自前でsign-inルートを作る必要がなくなります。
7. 開発効率をブーストするおすすめプラグイン
Better-Authの真骨頂は、豊富なプラグインによる拡張性です。2026年のモダンWebアプリ開発において「必須級」と言えるものを厳選しました。
🔐 Two Factor Authentication (2FA)
OTP (One Time Password) による二要素認証を、わずか数行で追加できます。
import { twoFactor } from "better-auth/plugins";
export const auth = betterAuth({
plugins: [
twoFactor({
issuer: "My Astro App", // 認証アプリに表示される名前
}),
],
});
🗝️ Passkey (パスキー)
指紋認証やFace IDを使ったパスワードレスログインを実現します。Expoなどのモバイルアプリ(React Native)開発でも、標準でサポートされています。
💳 Payment (Stripe)
SaaSやサブスクリプション型サービスを作るなら、公式のStripeプラグインが最強の武器になります。 ユーザー登録と同時にStripe Customerを作成したり、Webhook(決済成功など)をハンドリングしてDBを更新する処理が自動化されています。「認証と課金の連携」という最もバグを生みやすい部分をライブラリに任せられるのは大きなメリットです。
🏢 Organization (Multi-tenancy)
SaaS開発に必須の「組織管理」機能。チームの作成、メンバー招待、権限管理(RBAC)がゼロから実装済みです。「これを作るためだけにClerkを使っていた」という層には強力な移行理由になります。
8. パフォーマンスについて:Better-Auth vs Auth.js
導入時に気になるのがバンドルサイズと実行速度です。
- バンドルサイズ : フル機能版のBetter-Authは比較的大容量(Unpacked ~4.6MB)ですが、クライアントサイドで使用されるのは厳選された軽量なSDK(Gzipped ~168kB)です。
- Minimal Mode : カスタムアダプターを使用する場合、不要なドライバーを削ぎ落とした
better-auth/minimalを使うことで、さらに軽量化が可能です。 - Auth.jsとの比較 : Auth.js (NextAuth v5) は、クライアントサイドで
SessionProviderを使うとポリフィル等の影響でバンドルが肥大化する問題が報告されています。Better-AuthはAstroのServer Islands前提であれば、クライアントサイドJSを極小化できる利点があります。
9. よくあるハマりポイント (Troubleshooting)
よくある質問
OAuthで state_mismatch エラーが出る
Google Cloud Console等の『承認済みのリダイレクトURI』を確認してください。また、MiddlewareでのCookie処理が干渉していないかもチェックが必要です。
データベース接続エラーになる
Better-Authはスネークケース等の命名規則に比較的厳格です。既存DBを使う場合は schema 設定で明示的なマッピングを行ってください。
環境変数が読み込まれない
BETTER_AUTH_SECRET と BETTER_AUTH_URL が .env にあり、かつ astro.config.mjs でロードされているか確認しましょう。
Deep Dive: Better-Auth Plugin システムの設計思想
Better-Auth が他のライブラリと一線を画すのは、その「プラグイン・ファースト」な設計にあります。すべての拡張機能はコアと同じフックにアクセスでき、ミドルウェア・レベルでリクエストをインターセプトします。
export const auth = betterAuth({
plugins: [
// プラグインが自動的に DB スキーマを拡張し、
// /api/auth/two-factor などのエンドポイントを生やす
twoFactor(),
],
});
これにより、コアコードを汚すことなく、組織管理や支払いなどの複雑なビジネスロジックをモジュールとして追加・削除できるようになっています。
まとめ
2026年、Astroで認証を実装するなら、 Better-Authがデファクトスタンダード であると言っても過言ではありません。Clerkのような利便性と、自作ライブラリのような自由度を兼ね備えたこのツールは、あなたのプロダクト開発を劇的に加速させるはずです。
プロを目指す人のためのTypeScript入門
おすすめ書籍紹介
Better-Authの真価である『型安全性』を100%引き出すには、TypeScriptの深い理解が不可欠です。Astro × Better-Auth開発の必携書。






⚠️ コメントのルール
※違反コメントはAIおよび管理者により予告なく削除されます
まだコメントがありません。最初のコメントを投稿しましょう!