django 如何在用户无法看到/访问的情况下存储API密钥(令牌)客户端?

2eafrhcq  于 2023-06-07  发布在  Go
关注(0)|答案(1)|浏览(135)

我正在处理一个处理敏感客户信息的项目。显然,安全是一个高度优先事项。我们最近创建了一个API,我们希望使用它来访问数据库以访问/修改数据。存储API令牌客户端的最佳方式是什么?我们目前使用html模板文件的 meta标记来存储csrf令牌,但我们不希望API令牌可见。
下面是csrf令牌的代码,它可以工作。

//Capture and store the csrf Token
  useEffect(() => {
    const csrfToken = document.querySelector('meta[name="csrf-token"]').getAttribute('content');
    setToken(csrfToken);
    console.log({sessionToken, csrfToken});
  }, []);

下面是我们用作模板的索引文件的标记

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta name="csrf-token" content="{{ csrf_token }}">
  <meta name="api-token" content="{{ request.session.api_token }}">
</head>

这也可以工作,但是如果有人检查页面,API令牌是可见的。
我们使用Django / Python后端和React前端。这是否涉及使用Cookie?还是会变得更复杂任何帮助将不胜感激。如果您需要查看代码的任何其他部分,请告诉我。
我尝试将其添加到 meta标记,并将其添加到会话存储。这两种选择都不正确。

piztneat

piztneat1#

将API密钥存储在客户端而不将其暴露给用户可能具有挑战性,因为客户端代码本质上是用户可访问的。但是,您可以使用一些技术来增强安全性。以下是几个选项:

**服务器端代理:**您可以创建一个服务器端代理,作为客户端和API之间的中介,而不是直接在客户端存储API密钥。客户端向服务器发送请求,然后服务器将API密钥包含在与实际API的服务器到服务器通信中。这样,API密钥对客户端保持隐藏。我在github上发现了这个方法,也许值得你看看:https://github.com/eofs/django-rest-framework-proxy
**基于令牌的身份验证:**考虑实施基于令牌的身份验证,例如JSON Web Tokens(JWT),其中客户端交换用户特定令牌以访问受保护的资源。服务器可以生成和管理这些令牌,并在每个请求上验证它们。这种方法避免了将API密钥直接暴露给客户端。更多关于JWT和使用Django Rest Framework实现它的信息,请点击这里:https://www.freecodecamp.org/news/how-to-use-jwt-and-django-rest-framework-to-get-tokens/
**后端会话存储:**您提到使用Django作为后端。一个选项是在验证用户之后将API密钥安全地存储在后端会话存储中。会话可以与用户的认证会话相关联,从而允许服务器代表用户处理API请求而不向客户端暴露API密钥。参见:https://docs.djangoproject.com/en/4.2/topics/http/sessions/
**服务器端环境变量:**这是一种常见的做法;您可以将API密钥存储为服务器端的环境变量。这样,密钥对客户端代码保持隐藏。然后,您的后端代码可以访问环境变量并将该键用于API请求。

请记住,虽然这些方法增强了安全性,但没有万无一失的方法可以完全隐藏敏感信息,不让获得客户端代码访问权限的攻击者知道。因此,实施额外的安全措施(如服务器端验证、速率限制和监控)以保护敏感的客户信息至关重要。

相关问题