【发布时间】:2021-05-29 14:47:09
【问题描述】:
我正在将一个项目从 React 转移到 Next.js,并且想知道相同的身份验证过程是否可以。基本上,用户输入他们的用户名和密码,然后通过 API (Node.js/Express) 对照数据库凭据进行检查。所以,我没有使用 Next.js 内部 api 功能,而是与我的 Next.js 项目完全解耦的 API。
如果登录凭据正确,则会将 JWT 令牌发送回客户端。我想将其存储在本地存储中,然后重定向用户。任何未来的 http 请求都将在标头中发送令牌,并通过 API 检查它是否有效。这样做可以吗?我问是因为我看到很多 Next.js 身份验证使用 cookie 或会话,但不知道这是否是我应该采用的“标准”方法。
【问题讨论】:
-
我有 Next.js/Django JWT 的生产经验,我不得不说如果你使用 JWT,你不能拥有经过身份验证的服务器端渲染页面,你必须只使受保护的路由 CSR而且您无法决定是否应在 Node.js 服务器中重定向您的用户,这将是一种条件渲染,您必须在
useEffect钩子中决定它,因此它只在客户端而不是服务器上呈现。 -
您应该将令牌存储在 HttpOnly cookie 中,因为这样它会与所有请求一起传递。使用 localStorage 和
Authorization标头,问题是当用户访问页面时您无法设置Authorization标头(+ 它的安全性有点低,因为在某些情况下恶意 JS 代码可能会访问它)。我经常看到这种 localStorage 模式(过去经常使用它),但这不是最好的方法。此模式适用于来自浏览器的 REST API 调用,但不适用于保护 Web 应用程序页面,cookie 更适合。 -
感谢您的回复。您提到了用于 REST API 调用的模式,这是我必须做的,因为 api 不在我的 next.js 应用程序中。这是一个外部 API,我必须将标头中的令牌发送到,因为 jwt 令牌是在 node.js 服务器上创建的。话虽如此,您是否建议当 jwt 令牌从服务器发送到客户端时,我将令牌存储在仅 http cookie 中,然后在进行 API 调用时,我从标头中的 cookie 发送令牌,而不是从本地存储中获取令牌?
标签: node.js reactjs express next.js server-side-rendering