惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Application and Cybersecurity Blog
Application and Cybersecurity Blog
The Register - Security
The Register - Security
V
Visual Studio Blog
aimingoo的专栏
aimingoo的专栏
Stack Overflow Blog
Stack Overflow Blog
IT之家
IT之家
量子位
C
Check Point Blog
博客园 - 【当耐特】
小众软件
小众软件
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
雷峰网
雷峰网
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Microsoft Azure Blog
Microsoft Azure Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Engineering at Meta
Engineering at Meta
Recorded Future
Recorded Future
The Last Watchdog
The Last Watchdog
博客园 - Franky
N
Netflix TechBlog - Medium
Webroot Blog
Webroot Blog
A
About on SuperTechFans
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
W
WeLiveSecurity
D
Docker
S
Security Affairs
T
The Blog of Author Tim Ferriss
F
Fortinet All Blogs
Blog — PlanetScale
Blog — PlanetScale
V2EX - 技术
V2EX - 技术
Jina AI
Jina AI
Help Net Security
Help Net Security
L
LangChain Blog
P
Proofpoint News Feed
The Cloudflare Blog
WordPress大学
WordPress大学
Google DeepMind News
Google DeepMind News
Schneier on Security
Schneier on Security
Recent Announcements
Recent Announcements
Attack and Defense Labs
Attack and Defense Labs
云风的 BLOG
云风的 BLOG
V
Vulnerabilities – Threatpost
Microsoft Security Blog
Microsoft Security Blog
H
Heimdal Security Blog
P
Proofpoint News Feed
O
OpenAI News
H
Help Net Security
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
爱范儿
爱范儿
Security Archives - TechRepublic
Security Archives - TechRepublic

十月指南

使用AI开发一个应用最好的时间是现在 Kimi K2 发布并开源,实测效果确实很强! Vibe Coding实战:从翻车到上线,我开发了一款提前还贷计算器小程序 告别熬夜写代码!AI编程让我用Vibe Coding轻松上线 10 + 工具 用Vibe Coding方式打造 AI 内容创作平台 我连代码都没写,却做出JSON格式化工具—Vibe Coding了解一下 GPT 4.1、DeepSeek R1、Claude 3.7 代码生成横评,谁才是设计稿还原之王? AI 时代程序员生存指南 Cursor+Figma MCP 设计稿还原如此简单 MCP(模型上下文协议)是什么?它如何简化与API的AI集成 号外!我用Trae+Claude3.7开发的小程序上线啦 30分钟开发完成!Trae+Claude 3.7 打造小程序全流程揭秘! 5 分钟打造超酷小程序设计稿,Trae+Claude 3.7 太神了! 一句话生成设计稿,Trae+Claude 3.7 Sonnet,设计师也要被AI取代了 一句话生成应用!程序员效率翻倍的AI代码生成工具大盘点 我用AI创作了一首歌:Suno、海绵音乐、天工AI音乐生成效果测评 从哪吒2热潮到AI短片创作:AI视频实战测评 shadcn_ui:2024年最受欢迎的前端项目 实战:基于 Next.js+MoonShot API 开发一个 Github Trending 总结助手 技术篇:构建与部署 技术篇:Google 统计服务 技术篇:Next.js 多环境配置 技术篇:数据库-Prisma 技术篇:CSR、SSR、SSG、ISR 与客户端、服务端组件 技术篇:Next.js 路由与页面管理 技术篇:Next.js 项目结构 技术篇:Next.js 简介与概览 技术篇:从零开始掌握 Tailwind CSS 设计篇:独立开发设计入门 开篇:走上独立开发之路 Ollama:本地大模型运行指南 TooTool.net 理解 CSS 中的 Containing Block(包含块) 独立开发者工具大全(持续更新) TimeFlow 如何快速拥有一个技术博客 一个人从零开发上线一款App需要多少钱?终于有答案了! 深入理解HTTPS Nginx实战 Flutter Platform Channel 使用与源码分析 Android SDK类产品开发总结 360插件化框架 RePlugin 之 ClassLoader Hook Mac下Charles抓包配置 十一大西北体验 利用ContentProvider实现同步Binder macOS修改Android模拟器Hosts 走过 登山记 期待成长 小雨 静夜思 关于
技术篇:身份验证-NextAuth
十月 · 2024-11-07 · via 十月指南

学习目标:为应用接入用户登录功能

随着现代Web应用的复杂性不断增加,用户认证和授权变得至关重要。NextAuth.js 是一个开源的用户认证库,支持多种身份验证方式,包括 OAuth、邮件登录、凭证登录等。它专为 Next.js 设计,但也可以集成到其他 React 应用中。通过其丰富的配置选项和内置的安全特性,开发者可以快速搭建一个功能强大的认证系统。

核心概念与功能 #

Provider(认证提供者) #

Provider 是 NextAuth.js 用于实现身份验证的核心,NextAuth.js 支持多种认证提供者,如 OAuth Providers:Google, Facebook, GitHub, Twitter 等第三方服务,Email Provider:基于邮箱的登录方式,以及 Credentials Provider:允许开发者自定义基于用户名和密码的登录系统。

Session 管理 #

NextAuth.js 支持两种 Session 管理策略,通过 JWT(JSON Web Token)或基于数据库的会话管理来保持用户的登录状态。JWT Session 为默认策略,本文的演示也给予默认策略。

JWT(JSON Web Token) #

NextAuth.js 支持无状态身份验证,使用 JWT 存储会话信息。

数据库集成 #

为了保存用户信息和会话数据,NextAuth.js 可以与各种数据库(如 MongoDB、PostgreSQL、MySQL)集成。

Cookies #

成功登录后,NextAuth 会在你的浏览器中设置一组 Cookies。

Callbacks(回调函数) #

NextAuth.js 提供了多种回调函数,允许开发者在身份验证的不同阶段执行自定义逻辑。这些回调函数包括:

  • jwt:在生成或更新 JWT 时调用。
  • session:在生成或更新会话时调用。
  • signIn:在用户尝试登录时调用,可以控制是否允许登录。
  • redirect:控制登录或注销后的重定向行为。

内置安全机制 #

提供了多种内置的安全机制,例如 CSRF 保护、JWT 加密,确保身份验证流程的安全性。

实战示例 #

项目初始化 #

npx create-next-app@latest

 What is your project named?  example-auth
 Would you like to use TypeScript?  No / Yes
 Would you like to use ESLint?  No / Yes
 Would you like to use Tailwind CSS?  No / Yes
 Would you like to use `src/` directory?  No / Yes
 Would you like to use App Router? (recommended)  No / Yes
 Would you like to customize the default import alias (@/*)?  No / Yes
image.png

安装 Next-Auth #

首先需要安装 NextAuth.js 和相关依赖:

创建 GitHub OAuth 应用 #

在集成 GitHub 登录之前,你需要创建一个 GitHub OAuth 应用来获取 Client IDClient Secret

  1. 登录 GitHub Developer Settings
  2. 在 “OAuth Apps” 下,点击 “New OAuth App”。
  3. 填写必要的信息:
    • Application name:你的应用名称。
    • Homepage URL:如 http://localhost:3000(本地开发时使用)。
    • Authorization callback URLhttp://localhost:3000/api/auth/callback/github(NextAuth.js 默认的 GitHub 回调 URL)。
  4. 创建应用后,你将获得 Client IDClient Secret

基本配置 #

app/api 目录下创建 auth/[...nextauth]/route.js 文件:

// app/api/auth/[...nextauth]/route.js
import NextAuth from "next-auth";
import GitHubProvider from "next-auth/providers/github";

const handler = NextAuth({
  providers: [
    GitHubProvider({
      clientId: process.env.GITHUB_ID,
      clientSecret: process.env.GITHUB_SECRET,
    }),
  ],
  session: {
    strategy: "jwt",
  },
  callbacks: {
    async session({ session, token }) {
      session.user.id = token.sub; // 将用户ID附加到会话中
      return session;
    },
  },
});

export { handler as GET, handler as POST };

这个 API 路由将处理 GitHub 的 OAuth 身份验证过程。NextAuth.js 默认会处理 GET 和 POST 请求,因此需要导出 GETPOST

设置环境变量 #

将 GitHub 应用的 Client IDClient Secret 配置到 .env 文件中:

GITHUB_CLIENT_ID=your-github-client-id
GITHUB_CLIENT_SECRET=your-github-client-secret
NEXTAUTH_URL=http://localhost:3000  # 本地开发时使用

确保用你从 GitHub 获取的 Client IDClient Secret 替换相应的占位符。

生成和配置 NEXTAUTH_SECRET #

你可以通过运行以下命令生成一个随机的 32 字节的密钥:

生成的密钥可能像这样:

base64encodedsecretstring==

NEXTAUTH_SECRET 配置到 .env 文件中:

NEXTAUTH_SECRET=base64encodedsecretstring==
GITHUB_CLIENT_ID=your-github-client-id
GITHUB_CLIENT_SECRET=your-github-client-secret
NEXTAUTH_URL=http://localhost:3000

NEXTAUTH_SECRET,用于加密会话令牌(JWT)等。

在客户端使用 useSession 管理会话 #

在 Next.js 13 中,使用 useSession 在页面或组件中显示用户的登录状态,并提供登录/注销按钮。

app/page.js 文件中,添加以下代码:

// app/page.js;
"use client";
import { useSession, signIn, signOut } from "next-auth/react";

export default function HomePage() {
  const { data: session, status } = useSession();

  if (status === "loading") {
    return <p>Loading...</p>;
  }

  return (
    <div className="p-10">
      {!session ? (
        <>
          <p>Not signed in</p>
          <button onClick={() => signIn("github")}>Sign in with GitHub</button>
        </>
      ) : (
        <>
          <p>Signed in as {session.user.email}</p>
          <img
            className="w-[100px] h-[100px]"
            src={session.user.image}
            alt={session.user.name}
            style={{ borderRadius: "50%" }}
          />
          <button onClick={() => signOut()}>Sign out</button>
        </>
      )}
    </div>
  );
}
  • useSession 钩子获取当前用户的会话信息。
  • 如果用户未登录,会显示一个 GitHub 登录按钮。
  • 登录后,显示用户的邮箱和头像,同时提供注销按钮。

配置 next-auth 提供的 Provider #

由于 App Router 是完全异步的,SessionProvider 必须包裹在根布局中。你需要在 app/layout.js 中配置 SessionProvider 以提供会话上下文。

  1. app 目录创建 Provider.js
"use client";
import { SessionProvider } from "next-auth/react";

export function Provider({ children }) {
  return <SessionProvider>{children}</SessionProvider>;
}
  1. app/layout.js 文件中添加 Providers
// app/layout.js
import "./globals.css";
import { Provider } from "./Provider";

export default function RootLayout({ children }) {
  return (
    <html lang="en">
      <body>
        <Provider>{children}</Provider>
      </body>
    </html>
  );
}

SessionProvider 确保会话信息可以在应用中的所有组件中访问。

运行应用 #

最后,在终端中运行 Next.js 应用:

访问 http://localhost:3000,你会看到登录界面。点击 “Sign in with GitHub”,并使用 GitHub 账号进行登录。

image <em>1</em>.png
image <em>2</em>.png
image <em>3</em>.png

回调与安全配置(可选) #

你可以在 callbacks 选项中进一步自定义登录过程,比如获取用户的更多 GitHub 信息:

callbacks: {
  async signIn({ user, account, profile }) {
    return profile.email.endsWith("@example.com") // 仅允许特定域名的 GitHub 用户登录
  },
  async jwt({ token, account }) {
    if (account) {
      token.accessToken = account.access_token
    }
    return token
  },
  async session({ session, token }) {
    session.accessToken = token.accessToken
    return session
  },
}

总结 #

NextAuth.js 是一个功能强大且灵活的认证解决方案,适合各种规模的应用。从简单的 OAuth 集成到复杂的自定义认证逻辑,它几乎可以满足所有的需求。通过本文我们正式接入登录功能。

参考 #

https://github.com/nextauthjs/next-auth

https://next-auth.js.org/

https://authjs.dev/concepts/session-strategies

https://next-auth.js.org/configuration/options#nextauth_secret

https://stackoverflow.com/questions/74992326/does-use-client-in-next-js-13-root-layout-make-whole-routes-client-component

https://dev.to/peterlidee/full-guide-for-authentication-with-next-14-nextauth-4-strapi-v4-using-google-and-credentials-provider-7jh