4

我有一个 Web 应用程序,我正在为其构建一个 Drupal 模块,该模块允许我的客户访问我的应用程序上的某些数据。

我打算将秘密 API 密钥分发给需要在他们的 Drupal 模块副本中输入该值的客户。然后这个 Drupal 模块与我的 web 应用程序对话,但我需要确保 POST 请求确实来自该源。

这个“密钥”如何用于传递一些信息,当我的应用程序收到它时,它知道:

(a) its from that client's server.
(b) it hasnt been eavesdropped on / copied and used by someone else?

我是否应该使用此 API 密钥作为密码来加密与 POST 请求的其余部分匹配的某些数据?收到它时,我使用我的 API 密钥副本对其进行解密,如果它与其余数据匹配,我认为它已验证?

有没有为我做这件事的框架?Zend 内部的东西?

4

2 回答 2

4

使用 HTTPS 并在请求中发送 API 密钥。就是这么简单。

如果您使用 HTTP,那么您将重新发明轮子。

更新:

这是阅读评论后的更新,因为在问题中您没有解释您想将 API 密钥提供给网站的访问者(在这种情况下,无论您做什么都会被搞砸)。

juanpaco 的评论解释了要做什么(以及我最初假设你在做什么),但我会尝试更详细地解释它。

重要的是您不要在 Web 表单中使用 API 密钥。API 密钥仅用于您的客户服务器和您的 API 服务器之间的通信。

这是一个简化的解释:

  1. 你给你的客户一个密钥和一些软件/模块/库来安装在他的服务器上。
  2. 当访问者访问您客户的网站时,他会看到您的模块生成的一些 HTML ,其中不包含任何 API 密钥,并且只能与您客户的服务器通信(如果涉及任何敏感信息或用户帐户,则使用 HTTPS)。
  3. 您在客户服务器上的模块从访问者那里获取请求。
  4. 您的模块使用 API 密钥(使用 HTTPS)连接到您的服务器。
  5. 您的 API 服务器响应客户的服务器。
  6. 客户的服务器响应访问者。

您的 API 密钥永远不会以明文形式发送,永远不会提供给网站访问者

这是使用 API 密钥的唯一合理方式,在我第一次阅读您的问题后,我认为您担心在服务器和客户服务器之间发送 API 密钥的安全性。

如果您的客户将他们的钥匙交给他们网站的每个访问者,那么无论您多么努力地尝试,这些访问者总是能够认识他们。为访问者提供 API 密钥并使其可以使用但无法读取是不可能的。不难 -不可能。无论您使用什么协议、加密或任何东西。

(感谢 juanpaco 让我注意到这个旧答案。)

于 2011-03-11T14:13:26.260 回答
0
  1. 在生成要与客户端共享的 API 密钥之前,收集并存储每个客户端传入的 url(例如www.authorisedclienturl.com)作为您将存储在服务器上的参数的一部分。
  2. 客户端将使用 HTTPS 仅从其注册的授权客户端 URL 发送请求中的 API 密钥。
  3. 使用 API 密钥来描述服务器上的客户端信息并检索注册的客户端 url,验证传入的请求 url 是否存在于注册的 url 中,然后接受并继续其他进程。
于 2022-01-12T14:26:38.957 回答