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

使用Nginx/Lua检测HTTP基本用户/密码头并将其重写为自定义头,http,nginx,lua,3scale,Http,Nginx,Lua,3scale,我正在使用一个历史API,该API通过密钥/密码组合授予访问权限,原始API设计器指定的密钥/密码应在HTTP Basic auth标头中作为用户名和密码传递,例如: curl -u api_key:api_secret http://api.example.com/.... 现在,我们的API客户端将不断增长,我们希望使用它来处理身份验证、速率限制和其他功能。根据3scale的指示和建议,我们将在API服务器前使用Nginx代理,该代理根据3scale的服务进行身份验证,以处理所有访问控制系

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

curl -u api_key:api_secret http://api.example.com/....
现在,我们的API客户端将不断增长,我们希望使用它来处理身份验证、速率限制和其他功能。根据3scale的指示和建议,我们将在API服务器前使用Nginx代理,该代理根据3scale的服务进行身份验证,以处理所有访问控制系统

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

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


使用我所知道的一种语言,例如Ruby,我可以解码HTTP_授权头,选择Base64编码部分,并对其进行解码以找到已提供的密钥和机密组件。但我是一名Nginx新手,不知道如何在Nginx中实现同样的功能,我也不知道3scale提供的Lua脚本是否可以/将成为解决方案的一部分…

只要在Nginx配置文件中稍加调整,就可以支持对3scale密钥重用HTTP授权头。正如您正确地指出的,您下载的Lua脚本就是实现这一点的地方

但是,对于导入到3scale的键,我建议使用稍微不同的方法。您可以使用单一密钥的用户密钥模式,而不是使用app\u id/app\u密钥身份验证模式。然后,您将为每个应用程序导入3scale的是api_key+api_secret组合的base64字符串

这样,您需要对配置文件所做的更改将更少、更简单

您需要遵循的步骤包括:

在3scale管理门户中,将身份验证模式设置为API密钥 转到代理配置屏幕,在那里设置API后端、映射和下载Nginx文件。 在“身份验证设置”下,将凭据的位置设置为HTTP标头。 下载Nginx配置文件并打开Lua脚本 查找文件末尾的以下行: 本地参数=get_auth_paramsheaders,string.splitngx.var.request,[1]

替换为: 本地参数=get_auth_paramsbasicauth,string.splitngx.var.request[1]

最后,在同一个文件中,将名为get_auth_params的整个函数替换为以下要点中的函数:
我希望这种方法适合你的需要。你也可以联系support@3scale.net如果你需要更多的帮助

只要在Nginx配置文件中稍作调整,就可以支持对3scale密钥重用HTTP授权头。正如您正确地指出的,您下载的Lua脚本就是实现这一点的地方

但是,对于导入到3scale的键,我建议使用稍微不同的方法。您可以使用单一密钥的用户密钥模式,而不是使用app\u id/app\u密钥身份验证模式。然后,您将为每个应用程序导入3scale的是api_key+api_secret组合的base64字符串

这样,您需要对配置文件所做的更改将更少、更简单

您需要遵循的步骤包括:

在3scale管理门户中,将身份验证模式设置为API密钥 转到代理配置屏幕,在那里设置API后端、映射和下载Nginx文件。 在“身份验证设置”下,将凭据的位置设置为HTTP标头。 下载Nginx配置文件并打开Lua脚本 查找文件末尾的以下行: 本地参数=get_auth_paramsheaders,string.splitngx.var.request,[1]

替换为: 本地参数=get_auth_paramsbasicauth,string.splitngx.var.request[1]

最后,在同一个文件中,将名为get_auth_params的整个函数替换为以下要点中的函数: 我希望这种方法适合你的需要。你也可以联系support@3scale.net如果你需要更多的帮助