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 深层次干货!

相关推荐
AI前端老薛7 分钟前
CSS实现动画的几种方式
前端·css
携欢11 分钟前
portswigger靶场之修改序列化数据类型通关秘籍
android·前端·网络·安全
GuMoYu12 分钟前
npm link 测试本地依赖完整指南
前端·npm
代码老祖12 分钟前
vue3 vue-pdf-embed实现pdf自定义分页+关键词高亮
前端·javascript
未等与你踏清风13 分钟前
Elpis npm 包抽离总结
前端·javascript
代码猎人13 分钟前
如何使用for...of遍历对象
前端
秋天的一阵风15 分钟前
🎥解决前端 “复现难”:rrweb 录制回放从入门到精通(下)
前端·开源·全栈
林恒smileZAZ15 分钟前
【Vue3】我用 Vue 封装了个 ECharts Hooks
前端·vue.js·echarts
颜酱16 分钟前
用填充表格法-继续吃透完全背包及其变形
前端·后端·算法
代码猎人16 分钟前
new操作符的实现原理是什么
前端