SuperAPI AI 工具集

using-authentication

安全与审计

查看项目

更新于 10-15 13:58

技能介绍

用途

该技能用于在应用中集成 Better Auth,实现客户端与服务端的认证功能。它覆盖会话访问、受保护路由、登录/登出以及获取用户数据等常见认证场景。

主要能力

  • 客户端认证:在 React 组件中使用认证客户端钩子(如 useSession、signOut)获取会话状态并处理登出。
  • 服务端会话访问:在 Server Components 和 API 路由中通过 auth.api.getSession 获取会话。
  • 受保护页面模式:对未认证用户进行重定向。
  • 认证页面模式:将已认证用户从认证页面重定向离开。
  • 登录:支持邮箱/密码登录和社交提供商登录。
  • 注册:支持邮箱/密码注册。
  • 登出:支持带回调的登出操作。
  • 认证后获取用户数据:在验证会话后获取用户特定数据。

使用方式

客户端认证

在 React 组件中使用认证客户端钩子:

"use client";

import { useSession, signOut } from "@/lib/auth/client";

export function UserMenu() {
  const { data: session, isPending } = useSession();

  if (isPending) return <div>Loading...</div>;
  if (!session) return <a href="/sign-in">Sign In</a>;

  return (
    <div>
      <span>{session.user.name}</span>
      <button onClick={() => signOut()}>Sign Out</button>
    </div>
  );
}

服务端会话访问

在 Server Components 和 API 路由中获取会话:

import { auth } from "@/lib/auth/server";
import { headers } from "next/headers";

// In a Server Component
export default async function Page() {
  const session = await auth.api.getSession({
    headers: await headers(),
  });

  if (!session) {
    return <div>Not signed in</div>;
  }

  return <div>Hello, {session.user.name}</div>;
}

// In an API route
export async function POST(request: Request) {
  const session = await auth.api.getSession({
    headers: await headers(),
  });

  if (!session) {
    return new Response("Unauthorized", { status: 401 });
  }

  // Use session.user.id for queries...
}

受保护页面模式

重定向未认证用户:

import { redirect } from "next/navigation";
import { headers } from "next/headers";
import { auth } from "@/lib/auth/server";

export default async function ProtectedPage() {
  const session = await auth.api.getSession({
    headers: await headers(),
  });

  if (!session) {
    redirect("/sign-in");
  }

  return <Dashboard user={session.user} />;
}

认证页面模式

将已认证用户从认证页面重定向离开:

import { redirect } from "next/navigation";
import { headers } from "next/headers";
import { auth } from "@/lib/auth/server";

export default async function SignInPage() {
  const session = await auth.api.getSession({
    headers: await headers(),
  });

  if (session) {
    redirect("/chats"); // Already signed in
  }

  return <SignIn />;
}

登录

import { signIn } from "@/lib/auth/client";

// Email/password
await signIn.email({
  email: "user@example.com",
  password: "password",
  callbackURL: "/chats",
});

// Social provider
await signIn.social({
  provider: "google",
  callbackURL: "/chats",
});

注册

import { signUp } from "@/lib/auth/client";

await signUp.email({
  email: "user@example.com",
  password: "password",
  name: "John Doe",
  callbackURL: "/verify-email",
});

登出

import { signOut } from "@/lib/auth/client";

await signOut({
  fetchOptions: {
    onSuccess: () => {
      router.push("/");
    },
  },
});

认证后获取用户数据

在受保护页面中,验证会话后获取用户特定数据:

export default async function DashboardPage() {
  const session = await auth.api.getSession({
    headers: await headers(),
  });

  if (!session) {
    redirect("/sign-in");
  }

  const [chats, profile] = await Promise.all([
    getUserChats(session.user.id),
    getUserProfile(session.user.id),
  ]);

  return <Dashboard chats={chats} profile={profile} />;
}

适用场景

适用于使用 Better Auth 的 Next.js 应用,需要在客户端和服务端处理用户认证、保护页面、管理登录状态以及获取用户数据的场景。

限制

资料中未提供关于收费、价格、平台支持范围、性能效果或具体使用步骤的额外信息。