本次实验使用的官方文档参考这里。
终于,今天我们可以体验一下网关服务器的一个比较实用的功能:网关层用户参数校验
。
在请求进入后端服务之前,可以在网关层,先过滤掉非法的请求。
这样一来,后端服务就可以集中处理业务功能。
0x01 准备工作
参考本作的前置文章, 我们需要一个http://aaa.com/v1/user/get
的API。并且,已经在Konga上配置好Service和Router。
并且要求,能正常访问:
0x02 Lua脚本编写
这里给出一个简单的校验规则:对请求参数的 HEADER
里要求包含一个 x-custom-auth
参数。
-- Get list of request headers
local custom_auth = kong.request.get_header("x-custom-auth")
-- Terminate request early if our custom authentication header
-- does not exist
if not custom_auth then
return kong.response.exit(401, "Invalid Credentials")
end
-- Remove custom authentication header from request
kong.service.request.clear_header('x-custom-auth')
- 由于Konga配置画面使用的PreFunction接收的参数是String格式的Lua脚本,
所以, 我们需要把编写好的Lua校验文件, 转换成去掉了换行符的String格式。
把上面的代码复制到lua-minifier里,:
拿到转换后的Lua压缩串:
local a=kong.request.get_header("x-custom-auth")if not a then return kong.response.exit(401,"Invalid Credentials")end;kong.service.request.clear_header('x-custom-auth')
0x03插件配置
打开Konga
中需要添加参数校验的Router
, 我们为它添加一个Plugin
在添加弹出的对话框中,
functions
中输入上面准备好的Lua字符串. 留意需要按回车
,才能正确输入.0x04 验证
此时,aaa.com上的接口,都需要在Header中添加 一个x-custom-auth
字段才能访问,
所以,此时如果直接访问,应该会返回一个 401
错误.
当我们添加了一这个请求参数,再次尝试接口请求:
此时, 我们的Request就可以通过PreFunction的检验,进入后端服务并正常返回了.
0x05 后记
看文档, kong的PreFunction可以支持@auth.lua
方式的引用.但是我在Konga没有试验成功. 以文件的方式添加网关校验功能, 对于稍微复杂的场景, 显的尤为重要. 后续有机会再次测试.
curl -i -X POST http://localhost:8001/services/plugin-testing/plugins \
-F "name=pre-function" \
-F "config.functions=@custom-auth.lua"
这里的@custom-auth.lua
指的是 curl 命令提交文件参数。所以, 这个PreFunction暂时只能支持String
形式的控制脚本。
- 这里只是给出了最基本的校验方法, 实际开发过程中, 我们可以为一系列路由,添加更为实用的校验方法;也会用到一些其他后端服务:redis,mysql等. 好在Lua在这方面的支持程度已经十分强大.
今天的实战体验极好, 可操作性极高. 嬉しい~~