身份认证 WEB

NextAuth.js:Web身份认证

基于标准Web API构建的开源包,用于在任何JS运行时、任何平台上的任何框架的现代应用程序中进行身份验证。

2024年3月12日
分享

NextAuth.js是一个开源、全栈、自己管理数据的Web身份认证组件。

特性

灵活且易于使用

  • 设计用于与任何 OAuth 服务配合使用,支持 2.0+、OIDC
  • 许多流行登录服务的内置支持
  • 电子邮件/无密码身份验证
  • 带上您的数据库 - 或不带!- 与任何后端(Active Directory、LDAP 等)进行无状态身份验证
  • 与运行时无关,可以在任何地方运行!(Vercel Edge Functions、Node.js、无服务器等)

拥有您的数据

NextAuth.js 可以在有或没有数据库的情况下使用。

默认安全

  • 推广使用无密码登录机制
  • 默认情况下是安全的,并鼓励保护用户数据的最佳实践
  • 在 POST 路由(登录、注销)上使用跨站点请求伪造 (CSRF) 令牌
  • 默认 cookie 策略旨在为每个 cookie 提供最严格的限制性策略
  • 使用 JSON Web 令牌时,默认使用 A256CBC-HS512 对其进行加密 (JWE)
  • 具有选项卡/窗口同步和会话轮询功能,以支持短期会话
  • 尝试实施开放 Web 应用程序安全项目发布的最新指南

高级配置允许您定义例程来处理控制允许哪些帐户登录、编码和解码 JSON Web 令牌以及设置自定义 cookie 安全策略和会话属性,以便您可以控制谁可以登录以及会话登录的频率待重新验证。

入门

对于新项目,最简单的入门方法是克隆示例应用程序并按照 README.md 中的说明进行操作。

现有项目

安装

npm install next-auth

添加API路由

要将 NextAuth.js 添加到项目中,请在pages/api/auth创建一个名为[...nextauth].js的文件。其中包含 NextAuth.js 的动态路由处理程序,该处理程序还将包含所有全局 NextAuth.js 配置。

如果您使用Next.js 13.2或更高版本,用新的 App Router (app/),则可以按照我们的指南,使用新的路由处理器初始化配置。

import NextAuth from "next-auth"
import GithubProvider from "next-auth/providers/github"

export const authOptions = {
  // Configure one or more authentication providers
  providers: [
    GithubProvider({
      clientId: process.env.GITHUB_ID,
      clientSecret: process.env.GITHUB_SECRET,
    }),
    // ...add more providers here
  ],
}

export default NextAuth(authOptions)

所有对/api/auth/*( signIncallbacksignOut等)的请求都将由 NextAuth.js 自动处理。

配置共享会话状态

为了能够使用useSession,您首选需要在应用程序的顶层引入会话上下文<SessionProvider />

import { SessionProvider } from "next-auth/react"

export default function App({
  Component,
  pageProps: { session, ...pageProps },
}) {
  return (
    <SessionProvider session={session}>
      <Component {...pageProps} />
    </SessionProvider>
  )
}

然后,useSession的实例将可以访问会话数据和状态。<SessionProvider />还负责保持会话更新并在浏览器选项卡和窗口之间同步。

前端 - 添加 React Hook

NextAuth.js 客户端中的 useSession()React Hook 是检查某人是否登录的最简单方法。

import { useSession, signIn, signOut } from "next-auth/react"

export default function Component() {
  const { data: session } = useSession()
  if (session) {
    return (
      <>
        Signed in as {session.user.email} <br />
        <button onClick={() => signOut()}>Sign out</button>
      </>
    )
  }
  return (
    <>
      Not signed in <br />
      <button onClick={() => signIn()}>Sign in</button>
    </>
  )
}

您可以从应用程序中的任何位置使用该useSession钩子(例如在标头组件中)。

后端 - API 路由

要保护 API 路由,您可以使用getServerSession()方法。

import { getServerSession } from "next-auth/next"
import { authOptions } from "./auth/[...nextauth]"

export default async (req, res) => {
  const session = await getServerSession(req, res, authOptions)

  if (session) {
    res.send({
      content:
        "This is protected content. You can access this content because you are signed in.",
    })
  } else {
    res.send({
      error: "You must be signed in to view the protected content on this page.",
    })
  }
}

可扩展性

使用 NextAuth.js 回调

NextAuth.js 允许您通过我们的内置回调连接到身份验证流程的各个部分。

例如,要将值从登录传递到前端、客户端,您可以使用sessionjwt回调的组合,如下所示:

...
callbacks: {
  async jwt({ token, account }) {
    // Persist the OAuth access_token to the token right after signin
    if (account) {
      token.accessToken = account.access_token
    }
    return token
  },
  async session({ session, token, user }) {
    // Send properties to the client, like an access_token from a provider.
    session.accessToken = token.accessToken
    return session
  }
}
...

现在,每当您调用getSessionuseSession时,返回的数据对象将包含该accessToken值。

import { useSession, signIn, signOut } from "next-auth/react"

export default function Component() {
  const { data } = useSession()
  const { accessToken } = data

  return <div>Access Token: {accessToken}</div>
}

配置回调 URL(仅限 OAuth)

如果您通过我们的内置提供者之一 或自定义提供者使用 OAuth,则需要在提供者的设置中配置回调 URL。每个提供者都有一个“配置”部分,应该为您提供如何执行此操作的指导。

请按照以下步骤了解如何与 OAuth 提供者集成。

部署到生产环境

部署站点时,将NEXTAUTH_URL环境变量设置为网站的规范 URL。

NEXTAUTH_URL=https://example.com

来自:

更多文章

用于分析任何网站的一体化OSINT工具,支持IP信息、SSL链、DNS记录、cookie、标头、域信息、爬虫规则、页面地图、服务器位置、重定向分类、开放端口、跟踪路由、DNS安全扩展、站点性能、跟踪器、关联主机名等等。

2024年3月4日 · 系统管理 安全工具 WEB
ente-1
完全开源、端到端加密的Google Photos和Apple Photos替代品。
2024年3月4日 · 视频 隐私 照片 加密
transformer2-1
介绍Transformers模型的基本构造块,了解如何在实践中使用Transformers模型。同时介绍标记、模型、填充和掩码等一系列概念。
2024年2月28日 · Transformer NLP
lepton
使用不到 500 行代码构建您自己的对话式搜索引擎。
2024年2月28日 · LLM 搜索