在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
使用场景需要在后端服务之前做访问控制,或没有后端服务的场景,如静态文件。 实验环境Ubuntu 14.04 Nginx 1.4.6 安装 Lua 运行环境sudo apt-get install lua5.1 liblua5.1-dev liblua5.1-socket2 libluajit-5.1-2 libluajit-5.1-common nginx-extras 测试是否支持 lua在 Nginx server 配置中增加location块:
location /lua/test/ { default_type 'text/html'; content_by_lua 'ngx.say("hello world");'; } 能看到对应浏览器输出,表示当前Nginx已支持lua脚本: 简单的签名验证举例实现对某个静态文件目录添加签名验证。 URL参数包含当前时间戳“ts”,以及签名“sign”,lua脚本实现以下功能:
代码如下: location /lua/tmp/ { alias /tmp/; access_by_lua ' -- 配置的app id对应secret key local appIdKeys = { ["app001"] = "secretkey_1", ["app002"] = "secretkey_2" }; local args = ngx.req.get_uri_args(); local timestamp = args["timestamp"]; -- 获取参数的时间戳 local now = os.time(); -- 获取当前时间戳 local offset = math.abs(now - timestamp); -- 计算时间差绝对值 -- 时间戳相差超过300秒,返回403 if offset > 300 then ngx.status = ngx.HTTP_FORBIDDEN; ngx.say("403 Forbidden<br>"..now); ngx.exit(ngx.HTTP_FORBIDDEN); end local appid = args["appid"]; -- 参数中的APP ID local sign = args["sign"]; -- 参数中的签名 local curr_sign = ngx.md5(appIdKeys[appid] .. timestamp); -- 如果参数中的 sign 和计算得到的 curr_sign 不相等,则说明访问非法,禁止访问,否则放行访问 if curr_sign ~= sign then ngx.status = ngx.HTTP_FORBIDDEN; ngx.say("Invalid signature"); ngx.exit(ngx.HTTP_FORBIDDEN); end '; } 执行结果: 多说两句配合 lua-nginx-redis 模块,能够读取redis数据,实现更丰富的验证手段。
|
请发表评论