基於nginx+lua實現Token校驗


 場景:
需要對圖片服務器進行訪問控制,只有app發起的請求才能訪問
非app請求返回錯誤頁面。
解決思路與方案:
與研發討論后約定校驗token,token中包含timestamp和基於timestamp按照一定規則
進行md5+鹽值計算得到的key。server端使用nginx+lua校驗token,不一致則返回錯誤頁面
 
 
一.nginx+lua安裝
1.安裝luajit
tar -zxvf LuaJIT-2.0.5.tar.gz
cd LuaJIT-2.0.5
make && make install
vim /etc/profile
---------------------------------------------------------------------------------------------------------
export LUAJIT_LIB=/usr/local/lib
export LUAJIT_INC=/usr/local/include/luajit-2.0
---------------------------------------------------------------------------------------------------------
source /etc/profile
echo "/usr/local/lib" >> /etc/ld.so.conf
ldconfig
 
注:lib庫路徑一定記得加,否則后續安裝引用時提示找不到
 
2.安裝lua-nginx-module模塊及依賴ngx_devel_kit
mv v0.3.1 ngx_devel_kit-0.3.1.tar.gz
tar -zxvf ngx_devel_kit-0.3.1.tar.gz -C /usr/local/src/
wget https://github.com/openresty/lua-nginx-module/archive/v0.10.9rc7.tar.gz
mv v0.10.9rc7.tar.gz lua-nginx-module-0.10.9.tar.gz
tar -zxvf lua-nginx-module-0.10.9.tar.gz -C /usr/local/src/
 
3.先決條件已ok,編譯安裝nginx
cd /usr/local/src/nginx-1.14.2/
./configure --with-stream --with-stream_ssl_preread_module --with-stream_ssl_module --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --add-module=/usr/local/src/nginx_upstream_check_module-master --add-module=/usr/local/src/nginx-sticky --with-pcre=/usr/local/src/pcre-8.38 --with-zlib=/usr/local/src/zlib-1.2.11 --add-module=/usr/local/src/ngx_devel_kit-0.3.1 --add-module=/usr/local/src/lua-nginx-module-0.10.9rc7
 
4.安裝完畢后寫個經典測試頁驗證,訪問顯示“hello,world”則nginx+lua安裝成功
測試代碼:
---------------------------------------------------------------------------------------------------------
location /lua {
 
set $test "hello,world";
content_by_lua '
ngx.header.content_type="text/plain";
ngx.say(ngx.var.test);
';
}
---------------------------------------------------------------------------------------------------------
 
二.安裝md5模塊(如只通過nginx調試,則直接使用ngx.md5(str)即可,就不需要安裝這個模塊)
tar -zxvf md5-1.3.tar.gz -C /usr/local/src/
放入模塊路徑中
cp lua/md5.lua /usr/share/lua/5.1/
 
三.直接上lua代碼
vim /usr/local/nginx/lua/check.lua
---------------------------------------------------------------------------------------------------------
#!/usr/bin/lua
--獲取url中的參數
local args = ngx.req.get_uri_args()
local token = tostring(args["token"])
 
--定義校驗用key
local function getKey (timestamp,salt)
--根據timestamp里元素生成key,與研發約定一致即可,這里就不展示了
local value = ngx.md5(key)
return value
end
 
--拆解token中的key和timestamp
--x,y,z,w分別為截取位數,可自行設置
local tokenValue = ngx.decode_base64(token)
local keyValue = string.sub(tokenValue,x,y)
local timestamp = string.sub(tokenValue,z,w)
--salt鹽值自行設置
local salt = "xxxx"
local checkValue = getKey(timestamp,salt)
 
if (keyValue ~= checkValue)then
ngx.redirect("/50x.html")
end
 
---------------------------------------------------------------------------------------------------------
遇到的坑:
ngx.decode_base64(str)這里處理的是字符,拿過來的參數token需要先 tostring
轉換一下,否則error.log里有報錯:報錯內容如下
---------------------------------------------------------------------------------------------------------
2020/12/11 15:44:48 [error] 23948#0: *298 lua entry thread aborted: runtime error: /usr/local/nginx/lua/check.lua:21: string argument only
stack traceback:
coroutine 0:
[C]: in function 'decode_base64'
---------------------------------------------------------------------------------------------------------
 
四.nginx配置:
---------------------------------------------------------------------------------------------------------
location / {
rewrite_by_lua_file /usr/local/nginx/lua/check.lua;
root xxx;
index index.html index.htm;
}
---------------------------------------------------------------------------------------------------------
 
后記:
1.邊看lua邊寫的代碼,等待后續上生產看看情況,未知性能如何,參考思路即可,
具體代碼自行斟酌,謹慎使用
2.一點感想:
工作也是一個不斷學習的過程,而且這個學習是有着很強的目的和緊急性,來不及系統學習了先上車,很多場景都需要先解決問題,細節留待后續優化。后續使用會及時更新反饋,歡迎大家一起討論。
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM