背景
原请求场景是:
请求—NG—网关—后端服务
现在平台方想让请求统一通过自己的里约网关在转到我们的网关上,请求场景变成了:
请求—NG—里约网关—网关—后端服务
里约网关需要验证,验证方式就是将随机串+密钥+时间戳通过sha加密出字符串,再将这几个key添加到请求头中,因代码是统一的 多平台的,因此想在ng上实现自动加签。
尝试过ng+fastcgi实现 没走通,最后通过OpenResty实现此功能。
安装OpenResty
这里为了快速测试没指定什么安装参数,指定方式和ng一致,可按需求进行指定,安装路径在/usr/local/openresty/
1 2 3 4 5 6 7
| yum install pcre-devel gcc make gmake -y wget https://openresty.org/download/openresty-1.19.9.1.tar.gz tar xvf openresty-1.19.9.1.tar.gz mv openresty-1.19.9.1.tar.gz openresty-1.19.9.1 ./configure gmake gmake install
|
安装lua扩展shell模块
因为对lua不熟悉,不知道如何取随机串和时间戳 通过sha加密,所以通过lua调用shell完成取值和修改请求头
此步骤参考博文:https://www.programminghunter.com/article/1968140042/
安装sockproc
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| 下载地址:https://github.com/juce/sockproc
具体安装步骤:
git clone https://github.com/juce/sockproc.git
cd sockproc/
-- 通过gcc 编译生成一个可执行的文件 sockproc gcc -o sockproc ./sockproc.c
tinywan@tinywan:~/sockproc$ ls LICENSE Makefile README.md sockproc sockproc.c tests.sh
./sockproc /usr/local/sockproc/shell.sock
chmod 0666 /usr/local/sockproc/shell.sock
|
安装lua扩展shell模块
1 2 3 4 5 6
| git clone https://github.com/juce/lua-resty-shell 复制 shell.lua 文件到自己的项目库中去
/home/tinywan/Openresty_Protect/First_Protect/lualib/resty
sudo cp /home/tinywan/lua-resty-shell/lib/resty/shell.lua /usr/local/openresty/lualib/resty/exshell.lua
|
添加lua处理和配置nginx
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| nginx.conf根据需求添加lua脚本 location /gateway/ { access_by_lua_file "/usr/local/openresty/lua/changeReqHeader.lua"; proxy_pass http://a.cn/b/web/gateway/; } [root@aaa openresty] local shell = require "resty.exshell" local args = { socket = "unix:/usr/local/sockproc/shell.sock", } local status,timestamp,err = shell.execute("echo -n $(date +%s)", args) local out,nonce,err = shell.execute("head -c 20 /dev/urandom | base64 | tr -dc [a-zA-z];echo -n",args) local token = "123456" local finsign = timestamp..token..nonce..timestamp local paas = "web" local finsignCommand = "echo -n $(echo -n "..finsign.."|sha512sum|awk \'{print $1}\'|tr -d \' \')" local out,signature,err = shell.execute(finsignCommand,args) local finalsignature = string.gsub(signature,"\\n", "") ngx.req.set_header("X-Nonce",nonce) ngx.req.set_header("X-Paas",paas) ngx.req.set_header("X-Sign",finalsignature) ngx.req.set_header("X-Timestamp",timestamp)
ngx.header["X-Paas"] = paas ngx.header["X-Timestamp"] = timestamp ngx.header["X-Nonce"] = nonce ngx.header["X-Sign"] = finalsignature
|
参考文档
lua-resty-shell 库
OpenResty官方安装步骤
使用openresty通过lua修改请求/响应头
nginx内置变量
OpenResty官方github文档\