如何将 API 设为私有(即只能从前端访问,人们无法编写自己的 python 脚本/postman api 调用(

问题描述 投票:0回答:1

现在我正在使用 JWT 构建一个 React Next.js Web 应用程序进行身份验证,但我不确定如何使某些 API 调用只能从前端访问。我将 JWT 存储在仅使用 HTTP 的 cookie 中,安全性为 true,并从后端获取 cookie 进行身份验证。但我意识到即使有了这些设置,客户端也可以访问它: 使用此令牌,我可以通过设置标头 Cookie“token=...”来进行 API 调用。 HTTP端点正常响应并发回数据: 有没有办法让人们,甚至是登录自己帐户的实际用户,无法通过自己的脚本访问 API?

我想到的一些事情是:

  1. API 密钥:如果我将 API 密钥存储在 .env 中,则只能作为 NEXT_PUBLIC_APIKEY 进行访问,我认为这也可以为客户端提供访问权限。
  2. 加密 JWT。同样的问题,我无法在不暴露私钥的情况下解密前端的 cookie。另一方面,如果我在后端解密,那么人们就可以使用加密的令牌发送请求。

听说限速+短期令牌过期和IP白名单是解决方案。这些是可行的解决方案吗?另外,标准解决方案是什么?顺便问一下,Auth0 是否将 HTTP 端点设为私有?

security next.js cookies jwt
1个回答
0
投票

我认为您对基于 JWT 的身份验证的工作原理有点困惑。这是一个概要:

  1. 您生成一个只有服务器知道的 32 字节(最小)安全字符串。我们称之为 JWT_SECRET。
  2. 用户登录,您向 ORM/DB 发出请求以验证他们的登录凭据。
  3. 您创建一个 JWT 有效负载对象,其中包含他们的基本联系信息,以及可能的角色、组等。
  4. 您使用 JWT_TOKEN 对该有效负载进行签名和加密。我个人使用
    jose
    库来处理这个问题。这是一个不错的纯 JS JWT 包
  5. 您将 JWT 加密负载设置为仅 HTTP 的安全 cookie

现在,在后续请求中,您可以使用 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

© www.soinside.com 2019 - 2024. All rights reserved.