2025年全球最受欢迎的JS鉴权框架Better Auth,3分钟带你学会

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 有几个明显的优势:

  1. 框架无关:不绑定特定框架,React、Vue、Svelte、Next.js、Nuxt 都能用
  2. TypeScript 原生:完整的类型支持,开发体验更好
  3. 插件化架构:需要什么功能就加什么插件,不会引入不必要的依赖
  4. 现代化设计:采用最新的 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 深层次干货!

相关推荐
AlbertZein2 小时前
Agent 场景下,谁才是真正好用的 Flash 模型
aigc·ai编程
uccs3 小时前
流式响应的三次进化:EventSource → ReadableStream → TransformStream
openai·ai编程·claude
lichenyang4536 小时前
Docker 学习笔记(一):为什么需要镜像、容器和仓库?
前端
kyriewen6 小时前
别再对着 TypeScript 报错发呆了:我把 10 个最常见的红色波浪线翻译成了人话
前端·javascript·typescript
IT_陈寒7 小时前
SpringBoot自动配置的坑,我的API突然就404了
前端·人工智能·后端
不丿二7 小时前
AI 时代下的个人工作台沉淀——一个越用越懂你的本地 AI 助手
ai编程
奇奇怪怪的7 小时前
Embedding 模型 10+ 横向评测
前端
陈广亮7 小时前
Monorepo 从 0 到 1 实操指南 2026 版:pnpm catalogs + Turborepo 2.x + changesets 全链路
前端
子兮曰7 小时前
OpenMontage 深度解剖:你的 AI 编程助手,其实是个视频工作室
前端·后端·ai编程