我正在使用一个历史api,它通过密钥/秘密组合授予访问权限,原始api设计器指定的密钥/秘密组合应作为用户名和密码在http基本身份验证头中传递,例如:
curl -u api_key:api_secret http://api.example.com/....
现在,我们的api客户端数量将不断增长,我们希望使用3scale来处理身份验证、速率限制和其他功能。根据3scale的指示和建议,我们将在我们的api服务器前使用nginx代理,该代理根据3scale的服务进行身份验证,以处理所有的访问控制系统。
我们将把现有客户的密钥和机密输出到3个等级,并保持这两个系统同步。我们需要现有的应用程序继续以现有的方式接收密钥和秘密,因为一些返回的数据是客户端特定的。但是,我需要找到一种方法,将3scale本机不支持作为身份验证方法的http basic身份验证请求转换为重写的自定义头。
我已经能够使用nginx和lua配置来设置代理,3scale为您配置了这些配置。这允许将
-u key:secret
传递到我们的服务器并正确处理。不过,目前,我还需要添加与查询参数或自定义头相同的身份验证信息,以便3scale可以管理访问。我希望我的NGNIX代理可以为我处理这个问题,这样用户就可以以预先存在的方式提供一组Auth-Tebug,并且3Stand也可以把它拾起。
在我熟悉的语言中,例如ruby,我可以解码http_授权头,选择base64编码部分,并对其进行解码,以找到已提供的密钥和机密组件。但我是一个nginx新手,不知道如何在nginx中实现同样的功能(我也不知道3scale提供的lua脚本是否可以/将成为解决方案的一部分)。
最佳答案
只需在nginx配置文件中稍作调整,就可以支持对3scale键重用http授权头。正如您正确指出的,您下载的lua脚本就是这样做的地方。
不过,对于导入到3scale的键,我建议使用稍微不同的方法。不使用app_id/app_密钥身份验证模式,您可以使用user_密钥模式(这是单个密钥)。然后,您将为每个应用程序导入3scale的内容是api_key+api_secret组合的base64字符串。
这样,您将需要对配置文件进行的更改将更少、更简单。
您需要遵循的步骤是:
在3Scale管理门户中,将身份验证模式设置为API密钥(https://support.3scale.net/howtos/api-configuration/authentication-patterns)
转到proxy配置屏幕(在那里设置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
我希望这种方法适合你的需要。如果需要更多帮助,也可以通过[email protected]联系。
关于http - 使用Nginx/Lua检测并将HTTP Basic用户/密码 header 重写为自定义 header ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21731739/