OpenResty_自动网关加签

背景

原请求场景是:
请求—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]# cat /usr/local/openresty/lua/changeReqHeader.lua
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文档\


OpenResty_自动网关加签
https://imwang77.github.io/2021/11/08/OpenResty_自动网关加签/
作者
imwang77
发布于
2021年11月8日
更新于
2024年1月3日
许可协议