需求: 一个应用暴露在外网,对登录用户做鉴权,相当于白名单用户. 原理: 用户在应用首页登录的时候会有get请求,在请求头中会有一串加密的base64字符串,经过jwt在线解码之后可以看到令牌过期时间,用户名以及其他信息,通过linux自带的base64命令依然可以解码出来
脚本
token.lua
local token = ngx.req.get_headers()["Authorization"]
local change = tostring(token)
local cmd = ("sh base1.sh " .. change)
local t = io.popen(cmd)
local result = t:read("*all")
local num = tonumber(result)
if num ~= 200 then
ngx.exit(ngx.HTTP_FORBIDDEN)
end
t:close()
base1.sh
#!/bin/bash
echo -e $(date "+%Y-%m-%d %H:%M:%S") "\033[32m ==========> \033[0m" "获取到的加密token有效字段为:" $2 >>name.log
name=$(echo -n $2 | awk -F "." '{print $2}' | base64 -d 2>/dev/null | sed 's/,/\n/g' | grep "preferred_username" | sed 's/:/\n/g' | sed '1d' | sed 's/}//g' | sed 's/\"//g')
echo -e $(date "+%Y-%m-%d %H:%M:%S") "\033[32m ==========> \033[0m" "base64解码之后的用户名为:" $name >>name.log
if [ -z "$2" ]; then
echo 200
else
if [[ $(grep -w "$name" name.txt | wc -l) == 1 ]]; then
echo 200
else
echo 403
fi
fi
白名单文件自己去配置吧
|