使用Nginx / Lua检测并重写HTTP Basic用户/密码标头到自定义标头中

时间:2014-02-12 15:10:32

标签: http nginx lua 3scale

我正在使用一个历史性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代理能够为我处理这个问题,以便用户以预先存在的方式提供一组auth详细信息,3scale也可以提取它。

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

1 个答案:

答案 0 :(得分:4)

通过Nginx配置文件中的小调整,可以支持重用3scale键的HTTP Authorization标头。正如您正确指出的那样,您下载的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。