2

我正在使用一个历史 API,它通过密钥/秘密组合授予访问权限,指定的原始 API 设计器应作为 HTTP 基本身份验证标头中的用户名和密码传递,例如:

curl -u api_key:api_secret http://api.example.com/....

现在我们的 API 客户群正在增长,我们希望使用3scale来处理身份验证、速率限制和其他功能。根据 3scale 的说明和建议,我们将在 API 服务器前使用 Nginx 代理,该代理针对 3scale 的服务进行身份验证以处理所有访问控制系统。

我们将把我们现有客户的密钥和秘密导出到 3scale 并保持两个系统同步。我们需要我们现有的应用程序继续以现有方式接收密钥和秘密,因为一些返回的数据是特定于客户端的。但是,我需要找到一种方法将 3scale 本身不支持作为身份验证方法的 HTTP 基本身份验证请求转换为他们所做的重写的自定义标头。

我已经能够使用 3scale 为您配置的 Nginx 和 Lua 配置设置代理。这允许将-u key:secret其传递到我们的服务器并正确处理。不过,目前,我需要另外添加相同的身份验证信息作为查询参数或自定义标头,以便 3scale 可以管理访问。我希望我的 Nginx 代理为我处理这个问题,以便用户以预先存在的方式提供一组身份验证详细信息,并且 3scale 也可以获取它。

在我知道的语言中,例如 Ruby,我可以解码 HTTP_AUTHORIZATION 标头,挑选出 Base64 编码的部分,然后对其进行解码以找到已提供的密钥和秘密组件。但我是 Nginx 新手,不知道如何在 Nginx 中实现相同的功能(我也不知道 3scale 提供的 Lua 脚本是否可以/将成为解决方案的一部分)......

4

1 回答 1

4

通过在 Nginx 配置文件中进行一些小调整,可以支持重用 3scale 密钥的 HTTP 授权标头。正如您正确指出的那样,您下载的 Lua 脚本就是执行此操作的地方。

但是,对于导入到 3scale 的密钥,我建议采用稍微不同的方法。除了使用 app_id/app_key 身份验证模式,您还可以使用 user_key 模式(它是单个密钥)。然后,您将为每个应用程序导入 3scale 的内容将是 api_key+api_secret 组合的 base64 字符串。

这样,您需要对配置文件进行的更改将更少且更简单。

您需要遵循的步骤是:

  • 在您的 3scale 管理门户中,将身份验证模式设置为 API 密钥 ( https://support.3scale.net/howtos/api-configuration/authentication-patterns )
  • 转到代理配置屏幕(在其中设置 API 后端、映射以及下载 Nginx 文件的位置)。
  • 在“身份验证设置”下,将凭据的位置设置为 HTTP 标头。
  • 下载 Nginx 配置文件并打开 Lua 脚本
  • 找到以下行(应该在文件末尾):

local parameters = get_auth_params("headers", string.split(ngx.var.request, " ")[1] )

  • 将其替换为:

local parameters = get_auth_params("basicauth", string.split(ngx.var.request, " ")[1] )

我希望这种方法适合您的需求。如果您需要更多帮助,也可以通过 support@3scale.net 联系。

于 2014-02-17T13:37:14.013 回答