本次實(shí)驗(yàn)使用的官方文檔參考這里。
終于,今天我們可以體驗(yàn)一下網(wǎng)關(guān)服務(wù)器的一個(gè)比較實(shí)用的功能:網(wǎng)關(guān)層用戶參數(shù)校驗(yàn)
。
在請(qǐng)求進(jìn)入后端服務(wù)之前,可以在網(wǎng)關(guān)層,先過(guò)濾掉非法的請(qǐng)求。
這樣一來(lái),后端服務(wù)就可以集中處理業(yè)務(wù)功能。
0x01 準(zhǔn)備工作
參考本作的前置文章, 我們需要一個(gè)http://aaa.com/v1/user/get
的API。并且,已經(jīng)在Konga上配置好Service和Router。
并且要求,能正常訪問(wèn):
0x02 Lua腳本編寫(xiě)
這里給出一個(gè)簡(jiǎn)單的校驗(yàn)規(guī)則:對(duì)請(qǐng)求參數(shù)的 HEADER
里要求包含一個(gè) x-custom-auth
參數(shù)。
-- 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配置畫(huà)面使用的PreFunction接收的參數(shù)是String格式的Lua腳本,
所以, 我們需要把編寫(xiě)好的Lua校驗(yàn)文件, 轉(zhuǎn)換成去掉了換行符的String格式。
把上面的代碼復(fù)制到lua-minifier里,:
拿到轉(zhuǎn)換后的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插件配置
打開(kāi)Konga
中需要添加參數(shù)校驗(yàn)的Router
, 我們?yōu)樗砑右粋€(gè)Plugin
在添加彈出的對(duì)話框中,
functions
中輸入上面準(zhǔn)備好的Lua字符串. 留意需要按回車
,才能正確輸入.0x04 驗(yàn)證
此時(shí),aaa.com上的接口,都需要在Header中添加 一個(gè)x-custom-auth
字段才能訪問(wèn),
所以,此時(shí)如果直接訪問(wèn),應(yīng)該會(huì)返回一個(gè) 401
錯(cuò)誤.
當(dāng)我們添加了一這個(gè)請(qǐng)求參數(shù),再次嘗試接口請(qǐng)求:
此時(shí), 我們的Request就可以通過(guò)PreFunction的檢驗(yàn),進(jìn)入后端服務(wù)并正常返回了.
0x05 后記
看文檔, kong的PreFunction可以支持@auth.lua
方式的引用.但是我在Konga沒(méi)有試驗(yàn)成功. 以文件的方式添加網(wǎng)關(guān)校驗(yàn)功能, 對(duì)于稍微復(fù)雜的場(chǎng)景, 顯的尤為重要. 后續(xù)有機(jī)會(huì)再次測(cè)試.
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 命令提交文件參數(shù)。所以, 這個(gè)PreFunction暫時(shí)只能支持String
形式的控制腳本。
- 這里只是給出了最基本的校驗(yàn)方法, 實(shí)際開(kāi)發(fā)過(guò)程中, 我們可以為一系列路由,添加更為實(shí)用的校驗(yàn)方法;也會(huì)用到一些其他后端服務(wù):redis,mysql等. 好在Lua在這方面的支持程度已經(jīng)十分強(qiáng)大.
今天的實(shí)戰(zhàn)體驗(yàn)極好, 可操作性極高. 嬉しい~~