我一直在尝试为 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”,而一些大型项目就使用这种方法。
任何人都可以向我指出这种情况的方向吗?
我正在将一个项目从 React 转移到 Next.js 并且想知道相同的身份验证过程是否可以。基本上,用户输入他们的用户名和密码,然后通过 API (Node.js/Express) 对照数据库凭据进行检查。因此,我没有使用 Next.js 内部 api 功能,而是使用与我的 Next.js 项目完全分离的 API。
如果登录凭据正确,则会将 JWT 令牌发送回客户端。我想将其存储在本地存储中,然后重定向用户。任何未来的 http 请求都将在标头中发送令牌并通过 API 检查它是否有效。这样做可以吗?我问是因为我看到很多 Next.js auth 使用 cookie 或会话,但不知道这是否是我应该采用的“标准”方法。