
2025年 JavaScript 10大最受欢迎的前端项目已经公布,Better Auth作为里面唯一的鉴权框架,受到了特别推荐,如果你还对它不太了解,请花3分钟时间,我将带你快速上手。
Better Auth 是什么?
Better Auth 是一个框架无关的、通用的身份验证和授权框架,专为 TypeScript 设计。它最大的特点就是功能全面,开箱即用。
核心能力一览
| 功能类别 | 具体能力 | 说明 |
|---|---|---|
| 基础认证 | 邮箱密码登录 | 内置安全的密码哈希和验证 |
| 社交登录 | OAuth 支持 | GitHub、Google、Discord、Twitter 等主流平台 |
| 安全增强 | 2FA 双因素认证 | 为账户提供额外安全层(邮箱、手机验证码等) |
| 会话管理 | 多会话支持 | 支持用户同时登录多个设备 |
| 企业功能 | SaaS 多租户支持 | 组织、团队、成员和邀请管理 |
| 高级功能 | SSO 单点登录 | 创建自己的身份提供商 |
| 扩展性 | 插件生态 | 通过插件扩展功能 |
这些功能,Better Auth 都封装好了,只需要配置一下就能用。
相比传统的认证方案(比如 NextAuth.js),Better Auth 有几个明显的优势:
- 框架无关:不绑定特定框架,React、Vue、Svelte、Next.js、Nuxt 都能用
- TypeScript 原生:完整的类型支持,开发体验更好
- 插件化架构:需要什么功能就加什么插件,不会引入不必要的依赖
- 现代化设计:采用最新的 Web 标准和最佳实践
下面以 Next.js + React 带大家快速上手(Express+ Vue 也基本一样)
下面我们以 Next.js 和 React 为例,看看如何快速集成 Better Auth。
一、安装和基础配置
首先安装 Better Auth:
npm install better-auth
然后创建环境变量文件 .env:
ini
BETTER_AUTH_SECRET=32位以上密钥
BETTER_AUTH_URL=http://localhost:3000
这里 BETTER_AUTH_SECRET 用于加密和哈希,必须至少 32 个字符。你可以用 openssl rand -base64 32 生成一个。
二、创建服务端认证实例
在项目根目录(或 lib/、utils/ 文件夹)创建 auth.ts:
php
import { betterAuth } from "better-auth";
import { Pool } from "pg"; // 以 PostgreSQL 为例
export const auth = betterAuth({
database: new Pool({
host: process.env.DB_HOST,
port: 5432,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
}),
});
如果你用的是 SQLite 或者想用 ORM(比如 Drizzle、Prisma),Better Auth 也提供了对应的适配器:
javascript
// 使用 Drizzle
import { drizzleAdapter } from "better-auth/adapters/drizzle";
import { db } from "@/db";
export const auth = betterAuth({
database: drizzleAdapter(db, {
provider: "pg", // 或 "mysql", "sqlite"
}),
});
三、创建数据库表
Better Auth 提供了 CLI 工具来管理数据库 schema:
bash
# 生成迁移文件
npx @better-auth/cli generate
# 或者直接迁移(仅支持 Kysely 适配器)
npx @better-auth/cli migrate
四、在 Next.js 中挂载 API 路由
在 Next.js App Router 中,创建 app/api/auth/[...all]/route.ts:
javascript
import { auth } from "@/lib/auth";
import { toNextJsHandler } from "better-auth/next-js";
export const { GET, POST } = toNextJsHandler(auth.handler);
这样相当于一个拦截器,所有 /api/auth/* 的请求都会被 Better Auth 处理。
五、创建客户端实例
在客户端,创建 lib/auth-client.ts:
javascript
import { createAuthClient } from "better-auth/react";
export const authClient = createAuthClient({
baseURL: "http://localhost:3000", // 如果是同域,一般就可以省略
});
六、在 React 组件中使用
好了,现在就可以在组件中使用认证功能了:
javascript
"use client";
import { authClient } from "@/lib/auth-client";
import { useState } from "react";
export default function LoginPage() {
const [email, setEmail] = useState("");
const [password, setPassword] = useState("");
const handleSignUp = async () => {
const { data, error } = await authClient.signUp.email({
email,
password,
name: "用户", // 可选
callbackURL: "/dashboard",
});
if (error) {
console.error("注册失败:", error);
} else {
console.log("注册成功:", data);
// 可以在这里做重定向
}
};
const handleSignIn = async () => {
const { data, error } = await authClient.signIn.email({
email,
password,
callbackURL: "/dashboard",
rememberMe: true,
});
if (error) {
console.error("登录失败:", error);
} else {
console.log("登录成功:", data);
}
};
return (
<div>
<input
type="email"
value={email}
onChange={(e) => setEmail(e.target.value)}
placeholder="邮箱"
/>
<input
type="password"
value={password}
onChange={(e) => setPassword(e.target.value)}
placeholder="密码"
/>
<button onClick={handleSignUp}>注册</button>
<button onClick={handleSignIn}>登录</button>
</div>
);
}
七、获取当前会话
使用 useSession hook 来获取当前用户信息:
javascript
"use client";
import { authClient } from "@/lib/auth-client";
export default function Profile() {
const { data: session, isPending } = authClient.useSession();
if (isPending) {
return <div>加载中...</div>;
}
if (!session?.user) {
return <div>未登录</div>;
}
return (
<div>
<p>欢迎,{session.user.name}!</p>
<p>邮箱:{session.user.email}</p>
<button onClick={() => authClient.signOut()}>退出登录</button>
</div>
);
}
也可以在服务端获取会话信息,比如在 Next.js 的 Server Component 中:
javascript
import { auth } from "@/lib/auth";
export default async function ServerProfile() {
const session = await auth.api.getSession({
headers: await import("next/headers").then((m) => m.headers()),
});
if (!session) {
return <div>未登录</div>;
}
return <div>欢迎,{session.user.name}!</div>;
}
八、添加社交登录
以添加GitHub 登录为例,只需要在服务端配置中添加:
arduino
import { betterAuth } from "better-auth";
import { github } from "better-auth/plugins";
export const auth = betterAuth({
database: new Pool({ /* ... */ }),
plugins: [
github({
clientId: process.env.GITHUB_CLIENT_ID!,
clientSecret: process.env.GITHUB_CLIENT_SECRET!,
}),
],
});
然后在客户端调用:
css
<button onClick={() => authClient.signIn.social({ provider: "github" })}>
使用 GitHub 登录
</button>
国外的主流软件,Google、Hugging face、Twitter 等都支持,但是国内的钉钉、微信登录需要自行实现。
Better Auth vs 传统方案
| 特性 | 手写认证 | Better Auth |
|---|---|---|
| TypeScript 支持 | 需要自己写类型 | 原生支持 |
| 框架无关 | - | - |
| 插件生态 | - | 丰富(账号密码、OAuth2、第三方登录等等) |
| 多租户支持 | 需要自己实现 | 内置 |
| 2FA 支持 | 需要自己实现 | 内置 |
| 学习曲线 | 陡峭 | 平缓 |
在AI全栈时代, Better Auth逐渐成为了JS开发者进行鉴权开发的第一选择,所以它同样开放了MCP,可以在AI Coding时候更方便地调用。
我的公众号:橙子的AI前端笔记,谢谢大家关注,后续会持续输出更多前端 AI 深层次干货!