Next.js 身份验证策略

2024-06-23

我一直在尝试为 Next.js 项目实现可靠的身份验证流程,但现在我完全迷失了。我已经看过 Next.js 的示例存储库。但我对完整的解决方案有很多疑问。

我有一个express.js API 和一个单独的Next.js 前端项目。所有数据和身份验证均由 API 处理。前端只是使用 SSR 渲染页面。如果我只是创建一个整体项目,其中渲染页面和所有数据都由单个服务器处理(我的意思是 Next.js 的自定义服务器选项),我只会使用express-session 和 csurf。这将是管理会话和创建针对 CSRF 的安全性的传统方式。

Express.js API 不是必需的。这只是一个例子。它可以是 Django API,也可以是 .Net Core API。要点是,它是一个单独的服务器和一个单独的项目。

如何才能拥有一个简单而可靠的结构?我检查了一些我最喜欢的网站(netlify、zeit.co、heroku、spectrum.chat 等)。其中一些使用 localstorage 来存储访问和刷新令牌(存在 XSS 漏洞)。其中一些使用 cookie,甚至不是 HTTPOnly(XSS 和 CSRF 都容易受到攻击)。像spectrum.chat这样的例子使用了我上面提到的方式(cookie-session + 防止csrf)。

我知道围绕 JWT 代币存在着巨大的炒作。但我发现它们太复杂了。大多数教程只是跳过所有过期、令牌刷新、令牌撤销、黑名单、白名单等。

Next.js 的许多会话 cookie 示例几乎从未提及 CSRF。老实说,身份验证对我来说始终是一个大问题。有一天,我读到应该使用 HTTPOnly cookie,第二天我看到一个巨大的流行网站甚至没有使用它们。或者他们说“永远不要将你的代币存储到 localStorage”,而一些巨大的项目就使用了这种方法。

谁能为我指明这种情况的方向?


免责声明:我是下面的免费开源包的维护者,但我认为在这里是合适的,因为这是一个常见问题,没有一个很好的答案,因为许多流行的解决方案都存在问题中提出的特定安全缺陷(例如在适当的情况下不使用 CSRF 并向客户端 JavaScript 公开会话令牌或 Web 令牌)。

套餐NextAuth.js https://next-auth.js.org尝试使用免费的开源软件来解决上述问题。

  • It uses httpOnly饼干与secure.
  • 它具有 CSRF 保护(双重提交 cookie 方法,带有签名 cookie)。
  • Cookie 带有适当的前缀(例如__HOST- or __Secure).
  • 它支持电子邮件/无密码登录和 OAuth 提供商(其中包括许多提供商)。
  • 它支持 JSON Web 令牌(签名+加密)和会话数据库。
  • 您可以在没有数据库的情况下使用它(例如任何 ANSI SQL、MongoDB)。
  • Has a 现场演示 https://next-auth-example.now.sh (查看源代码 https://github.com/nextauthjs/next-auth-example).
  • 它是 100% FOSS,不是商业软件或 SaaS 解决方案(不销售任何东西)。

API 路由示例

e.g. page/api/auth/[...nextauth.js]

import NextAuth from 'next-auth'
import Providers from 'next-auth/providers'

const options = {
  providers: [
    // OAuth authentication providers
    Providers.Apple({
      clientId: process.env.APPLE_ID,
      clientSecret: process.env.APPLE_SECRET
    }),
    Providers.Google({
      clientId: process.env.GOOGLE_ID,
      clientSecret: process.env.GOOGLE_SECRET
    }),
    // Sign in with email (passwordless)
    Providers.Email({
      server: process.env.MAIL_SERVER,
      from: '<[email protected] /cdn-cgi/l/email-protection>'
    }),
  ],
  // MySQL, Postgres or MongoDB database (or leave empty)
  database: process.env.DATABASE_URL
}

export default (req, res) => NextAuth(req, res, options)

反应组件示例

e.g. pages/index.js

import React from 'react'
import { 
  useSession, 
  signin, 
  signout 
} from 'next-auth/client'

export default () => {
  const [ session, loading ] = useSession()

  return <p>
    {!session && <>
      Not signed in <br/>
      <button onClick={signin}>Sign in</button>
    </>}
    {session && <>
      Signed in as {session.user.email} <br/>
      <button onClick={signout}>Sign out</button>
    </>}
  </p>
}

即使您不选择使用它,您也可能会发现该代码作为参考很有用(例如如何JSON 网络令牌 https://github.com/nextauthjs/next-auth/blob/main/src/lib/jwt.js被处理并且他们如何在会议中轮换 https://github.com/nextauthjs/next-auth/blob/main/src/server/routes/session.js.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Next.js 身份验证策略 的相关文章

  • 如何在 React 组件中处理 script.src URL 回调?

    我似乎无法弄清楚如何根据 google 的脚本 GET 请求触发函数 export class Map extends Component constructor props super props this state component
  • 单击反应表时选择行

    我正在尝试找到与我的反应应用程序一起使用的最佳表格 目前 反应表 https www npmjs com package react table提供我需要的一切 分页 服务器端控制 过滤 排序 页脚行 话虽这么说 我似乎无法选择一行 没有e
  • 我应该选择哪个 redux 中间件?

    按照指南 我发现了一些用于 redux 应用程序的中间件 Redux 重击 https github com gaearon redux thunk Redux 承诺 https github com acdlite redux promi
  • 确保数组属性的每个元素都符合 React 中的自定义形状

    我想确保数组属性的每个元素都符合特定的形状 这与中回答的问题不同用形状反应 proptype 数组 https stackoverflow com questions 32325912 react proptype array with s
  • 在react中将表单数据传递给父类

    我有以下反应课程 var FormBox React createClass render function return h1 Forms h1
  • 在 React Native ios 应用程序中无法识别 fontFamily

    我正在努力获取我的字体 按开始2P 已加载 它是来自谷歌字体的字体 已多次执行以下步骤 以确保我没有马虎 从所有迹象来看 该字体应该在 React Native 应用程序中可用 在我的项目目录的根目录下创建了资产文件夹 在资产文件夹中创建字
  • Eslint 错误:不要嵌套三元表达式

    我正在使用 React js 开发一个项目 并且使用 eslint 时出现此错误 不要嵌套三元表达式 这是我的代码 const MyApp gt return lt gt var1 var2
  • 使用 Jest + React-testing-library 测试异步 `componentDidMount()`

    我有一个异步获取数据的组件componentDidMount componentDidMount const self this const url some path const data const config headers Con
  • 如何正确处理聊天消息应用程序的“已读”-“未读”状态?

    我目前正在开发一个反应本机应用程序 该应用程序使用 socket io 提供聊天室功能 我目前愿意处理消息的未读 已读状态 但我不知道该逻辑应位于何处 在客户端代码中还是在服务器端 这是我的代码组件的基本实现
  • 为什么我收到此错误:无效的挂钩调用。钩子只能在函数组件的主体内部调用/

    错误 无效的挂钩调用 钩子只能在函数组件的主体内部调用 发生这种情况可能是由于以下原因之一 您的 React 和渲染器版本可能不匹配 例如 React DOM 你可能违反了 Hooks 规则 您可能在同一个应用程序中拥有多个 React 副
  • 如何在没有到期时间的情况下使 JWT 令牌失效

    正在使用 JWT 创建一个 Node js 后端应用程序 对我来说 要求很简单 授权令牌不应该有任何到期时间 但是当用户更改密码时 我在使 JWT 失效期间遇到问题 当用户更改密码时 我将创建一个新的 JWT 令牌 并删除旧的令牌 但用户仍
  • React Native 中的 Object.keys 顺序

    假设在对象上调用 Object keys 总是以相同的顺序返回数组是否安全 我的意思是直到 ES2015 才在 JS 中指定它 但我不确定它在 React Native 中到底是如何的 属性键按以下顺序遍历 首先 键是按数字升序排列的整数索
  • 如何在会话过期后自动更新数据库而不刷新我的页面

    您需要刷新或单击该代码 然后它才会转到索引页面 并且在会话过期后更新数据库之前 如何让会话过期后自动更新数据库 使用户活跃度为0 而无需刷新或点击页面 idletime 3600 after 1hr the user gets logged
  • ASIHTTPRequest 登录页面

    我尝试制作一个 iPhone 应用程序 可以登录到使用 https 保护用户信息的 Web 应用程序 现在我陷入了登录页面 我不知道通过我的应用程序登录时如何检查用户网站中的真实帐户 即使我输入错误的帐户 我也只收到 200 的回复 这是我
  • typescript 如何输入类属性?

    我正在实现我的客户端渲染版本 我想输入我的route object 其结构如下 import Post from Post export const route path post component Post 请注意 Post 是一个未实
  • 使用核心 Node.js 进行会话管理,无需 Express.js

    如何在核心 Node js 非express js 项目中处理 创建用于服务器端会话管理的中间件 我可以找到基于 Express 的项目的模块 但不能找到核心 Node js 的模块 请向我推荐任何用于非express js 项目的模块或中
  • Web API 请求上的滑动会话

    UPDATE 看起来它正在尝试写入新的 cookie 标头ApplyResponseGrantAsync但不能因为它是抛出标头已发送的异常 UPDATE 更清楚 我如何获得Set Cookie在 Web API 请求期间添加到 XHR 响应
  • Swiper 8 和笑话

    Swiper 8和Jest 支持ESM 必须使用import来加载ES模块在此输入图像描述 https i stack imgur com e3bB4 png 在此输入图像描述 https i stack imgur com nUmhq p
  • Laravel 5 中的两个登录表单

    我一直想知道如何在 laravel 5 中制作两个登录表单一段时间 原因是因为我有一个多站点项目 我在一个项目中拥有管理站点和公共站点 我对路由进行了分组 以便管理路由回答一个域 公共路由回答另一个域 如下所示 Route group ar
  • 如何在功能性 React 组件中使用错误边界?

    I can 将类设置为错误边界 https reactjs org blog 2017 07 26 error handling in react 16 html在 React 中通过实现componentDidCatch 是否有一种干净的

随机推荐

  • 通过 HTTPS/SSL 的 Java 客户端证书

    我正在使用 Java 6 并尝试创建一个HttpsURLConnection使用客户端证书针对远程服务器 服务器使用自签名根证书 并要求提供受密码保护的客户端证书 我已将服务器根证书和客户端证书添加到我在其中找到的默认 java 密钥库中
  • 父视图控制器如何通知其子视图控制器已删除自身?

    子视图控制器的实现中通过以下代码删除子视图控制器 void commandFinishVC self view removeFromSuperview self removeFromParentViewController 子视图控制器及其
  • SQLite 用于大数据集?

    我有一个相当大的数据集 并且希望将其存储在文件中而不是 RDBMS 中 数据集中的主表的 CSV 大小刚刚超过 100 万行 30 列 大小约为 600Mb 我正在考虑 SQLite 对于这种大小的数据集 SQLite 值得研究吗 SQLi
  • Android:为什么系统重启后警报通知停止

    我正在开发一个 Android 应用程序 每天应该触发五次警报 每天的时间不是固定的 警报响起后 我将安排下一个警报 我的问题是 警报通知有效 1 天 然后停止 并且当设备重新启动两次时 通知不起作用 我现在不知道是否有其他方法可以做到这一
  • Swift:延迟封装映射、过滤器、FlatMap 链

    我有一份动物清单 let animals bear dog cat 以及一些改变该列表的方法 typealias Transform String gt String let containsA Transform 0 contains a
  • 如何添加 glassfish 工具到 eclipseoxy 3a

    我下载了 Eclipse Oxygen 但我没有在此 IDE 中安装 glassfish 工具 它是在 JDK 8 Update 172 上运行的 Oxygen 3A 64 位 当我尝试通过 Marketplace 安装这些工具时 它指出这
  • SQL在单个命令中在表中添加列和注释

    我的 Web 应用程序使用 Oracle 11g 我想向现有表添加列和注释 我可以使用以下命令轻松做到这一点 ALTER TABLE product ADD product description VARCHAR2 20 and COMME
  • AngularJS - 您可以在不修改其核心源代码的情况下重命名服务吗?

    我遇到过这样的情况 我下载了书面服务angular js 并且它工作得很好 但我更愿意在我的代码中将其称为不同的名称 只是为了方便和可读性 这并不是真正的要求 只是一种愿望 我可以在服务的实际源代码中仔细检查并更改它 但这显然会导致各种问题
  • 分区交换列类型或大小不匹配 (ORA-14097)

    我正在尝试对数据库进行交换分区 但出现以下错误 ORA 14097 ALTER TABLE EXCHANGE PARTITION 中的列类型或大小不匹配 剧本这样做已经创建了并且它在 Oracle 11g 数据库上按预期运行 当我更新到 1
  • 插入到子查询中具有多个值的表中

    INSERT INTO Reference TB RequestID WaveID VALUES 2222 select tWaveID from Table2 我正在使用上面的查询插入表中 我知道 Table2有多个tWaveID这就是为
  • Swift 中的精确字符串格式说明符

    下面是我之前如何将浮点数截断到小数点后两位 NSLog 02f 02f 02f r g b 我检查了文档和电子书 但无法弄清楚 谢谢 下面的代码 import Foundation required for String format pr
  • AWS RDS:从S3存储桶中的sql文件导入数据

    我有一个数据库备份作为 sql 文件存储在 s3 存储桶中 如何将该文件直接导入到 Aurora RDS 中 而不需要将其下载到我的 PC 上并手动导入 如果您的数据是有效的 SQL 转储 您可以在创建新的 Aurora 实例时指定其 S3
  • Google Groups API - getUsers() 您无权查看该群组的成员列表:

    大家干杯 我有一个 Google 脚本 它通过使用 getUsers 函数检查电子邮件地址是否是某个组的成员 So far 我已激活 Admin SDK目录服务 我有管理员权限 对于大多数组来说 它确实很神奇 但是在某些组的情况下我会收到授
  • CSS/Javascript:如何制作具有多种状态的旋转圆形菜单?

    通常我不会自己发布内容 我通常会通过其他人的线程找到我需要的内容 因此如果其中任何内容位于错误的位置或格式不正确 我很抱歉 我以前从来没有这样做过 所以情况是这样的 我正在尝试重建我的网站 并选择使用 WordPress 的 X 主题 大多
  • 使用ticker定期从经常变化的路径加载内存中的所有文件?

    我有一个应用程序需要从两个不同的路径读取文件 读取所有这些文件后 我需要将它们加载到内存中products map Path Full 这是内存中服务器启动期间需要加载的所有文件的路径 该路径将包含大约 50 个文件 每个文件大小约为 60
  • “正常”UIButton 导致 obj_stack_overflow 或 EXC_BAD_ACCESS 异常

    它看起来确实足够无害 在我的应用程序委托中 我检查NS用户默认值用于在启动时显示提示的标志 如果已设置 则在结束时applicationDidFinishLaunching 我这样做 TipsViewController vc TipsVi
  • 异步 WCF 最终方法中的 Thread.CurrentPrincipal 错误

    我有一个 WCF 服务 它有Thread CurrentPrincipal设置在ServiceConfiguration ClaimsAuthorizationManager 当我像这样异步实现服务时 public IAsyncResult
  • 更改 ReCaptcha 语言 OnClick

    我意识到通过向 api js 添加 hl 选项来更改 Recaptcha 语言是微不足道的 https www google com recaptcha api js hl fr 我想做的是 当有人单击通过 QueryString 参数 例
  • 如何在 postgresql 查询中仅计算两个日期之间的天数。

    假设我给出了两个日期 如果相差一个月那么它应该显示为30天 即使是几个月也需要转换成天 我尝试过使用age date now timestamp without time zone 但它给出了月 日期 年格式 例如 10 个月 24 天 1
  • Next.js 身份验证策略

    我一直在尝试为 Next js 项目实现可靠的身份验证流程 但现在我完全迷失了 我已经看过 Next js 的示例存储库 但我对完整的解决方案有很多疑问 我有一个express js API 和一个单独的Next js 前端项目 所有数据和