现在我正在使用 JWT 构建一个 React Next.js Web 应用程序进行身份验证,但我不确定如何使某些 API 调用只能从前端访问。我将 JWT 存储在仅使用 HTTP 的 cookie 中,安全性为 true,并从后端获取 cookie 进行身份验证。但我意识到即使有了这些设置,客户端也可以访问它: 使用此令牌,我可以通过设置标头 Cookie“token=...”来进行 API 调用。 HTTP端点正常响应并发回数据: 有没有办法让人们,甚至是登录自己帐户的实际用户,无法通过自己的脚本访问 API?
我想到的一些事情是:
听说限速+短期令牌过期和IP白名单是解决方案。这些是可行的解决方案吗?另外,标准解决方案是什么?顺便问一下,Auth0 是否将 HTTP 端点设为私有?
我认为您对基于 JWT 的身份验证的工作原理有点困惑。这是一个概要:
jose
库来处理这个问题。这是一个不错的纯 JS JWT 包现在,在后续请求中,您可以使用 JWT_SECRET 运行
jwtVerify
,其中 1.) 验证 cookie 尚未更改,2.) 解码存储的用户信息。您可以存储角色和组等信息来确定路由访问并合并到您的业务逻辑中,但您需要一种在这些参数更改时使令牌失效并重新创建令牌的方法。这真的很好,因为它减少了数据库、Redis 等的负载,并允许您在中间件中运行这些检查,这需要保持非常快的速度。
您永远不会向客户端公开您的 JWT_SECRET,因此您不会使用 NEXT_PUBLIC 前缀。用户无法伪造令牌,因为他们不知道密钥。如果他们尝试使用不同的密钥对 JWT 进行编码,那么 jwtVerify 将失败。看,您可以在没有签名密钥的情况下解码 JWT,但如果没有使用相同的密钥签名,它们将无法验证。
现在,破解 JWT 签名或攻击者伪造 JWT 并非不可能,因此有时单独依赖 JWT 进行访问控制并不总是最好的。我个人喜欢对某些功能发出数据库请求。但这完全取决于你。
此外,如果您想存储用户数据(例如他们的公开个人资料显示),您可以设置一个单独的 cookie,其中包含其未加密的公开信息。或者您可以使用本地存储或索引数据库。我实际上创建了自己的 React 上下文,它允许我为索引数据库提供 Redis 风格的 API。如果你想要的话我可以给你代码。
我实际上写了一篇关于 Next.js 中 JWT 身份验证的深入博客文章。请随时查看。还有一个 GitHub 入门应用程序的链接,您可以查看代码示例:
https://blog.designly.biz/a-complete-guide-to-authentication-in-next-js-14