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

我正在使用一个历史悠久的API,通过一个密钥/秘密组合来授予访问权限,原始APIdevise者应该将其作为用户名和密码在HTTP基本身份validation标头中传递,例如:

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

现在我们的API客户端将会不断增长,我们正在寻求使用3scale来处理身份validation,速率限制和其他function。 根据3scale的指示和build议,我们将在我们的API服务器前使用一个Nginx代理,这个代理使用3scale的服务来处理所有的访问控制系统。

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

我已经能够使用3scale为你configuration的Nginx和Luaconfiguration设置代理。 这允许-u key:secret被传递给我们的服务器,并被正确处理。 目前,我需要另外添加相同的authentication信息作为查询参数或自定义标题,以便3scale可以pipe理访问。 我希望我的Nginx代理为我处理,以便用户以预先存在的方式提供一组authentication详细信息,3scale也可以提取。

在我知道的语言中,例如Ruby,我可以解码HTTP_AUTHORIZATION标头,selectBase64编码的部分,并解码它以find已经提供的密钥和秘密组件。 但是我是一个Nginx的新手,不知道如何在Nginx中实现同样的function(我也不知道3scale提供的Lua脚本是否可以成为解决scheme的一部分)…

    在Nginx配置文件中进行小小的调整可以支持重新使用3scale密钥的HTTP Authorization头。 正如你正确地指出,你下载的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] )

    • 最后,在同一个文件中,替换这个要点中名为“get_auth_params”的整个函数: https ://gist.github.com/vdel26/9050170

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