使用Nginx/Lua检测并将HTTP基本用户名/密码头重写为自定义头。

我正在使用一个历史悠久的 API 工作,该 API 通过密钥/秘密组合授权访问,原始 API 设计者指定应将其作为 HTTP 基本身份验证标题中的用户名和密码传递,例如:

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

现在我们的 API 客户端基数将会增长,我们计划使用 3scale 处理身份验证、速率限制和其他函数。根据 3scale 的指示和建议,我们将在 API 服务器前面使用一个基于 Nginx 的代理,该代理通过身份验证 3scale 的服务来处理所有的访问控制系统。

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

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

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

点赞
用户1956543
用户1956543

将 HTTP 授权头再次利用于 3scale 密钥可以通过更改 Nginx 配置文件来支持。正如您指出的那样,您下载的Lua脚本就是要这样做的地方。

但是,我建议在导入到 3scale 的密钥方面采用略微不同的方法。您可以使用 user_key 模式(即单个密钥),而不是使用 app_id/app_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-17 13:37:14