基于nginx的token认证

Nginx 的 token 认证是基于集成了 nginx+lua 的 openresty 来实现的.

  • 环境: centos 7
  • 部署方式: 增量部署(不影响原 nginx 版本)
  • 版本: openresty/1.13.6.2

需求:

对指定域名增加 http 请求头(header)验证,

请求头为 xxxx=xxxxx 形式.

如果验证不通过,返回 403 ‘请求头验证失败 或 Error request forbidden ’

实际代码示列:

  server {
        listen       80;
        server_name  www.aaa.com;
        access_log  logs/host.access.log  main;
        location /a/b/c {
                access_by_lua '
                local args = ngx.req.get_headers(); --获取请求中 header 头的列表.
                local token1 = args["appid"];   --取出 header 头中key为 appid 的值.
                local token2 = "123456";  --定义一个局部变量.
                local errs = "oh,Only Authorized Request will be Processe"  --定义错误提示消息
                if not token1 then
                        ngx.status = ngx.HTTP_FORBIDDEN --返回错误码
                        ngx.say(errs)  --返回错误消息
                        ngx.exit(200) -- 跟以上两个连用,固定写法
                end
 
                if token1 ~= token2 then
                        ngx.status = ngx.HTTP_FORBIDDEN
                        ngx.say(errs)
                        ngx.exit(200)
                else
                        return
                end
                ';
                proxy_pass http://www.google.com;
        }
}

实施过程中的坑:

背景介绍:
1.我是拷贝的原 nginx 下的配置文件,原 nginx 版本为 1.12.2.
2.测试环境为 openresty 中的nginx,版本为 1.13.6.2
我以为配置文件是通用的,虽然原版本 nginx 的配置文件在新版本中不兼容的部分,我都替换了,但还是产生了奇怪的问题...

  • 测试环境通过,生产环境无论怎么修改配置都无法通过,中间浪费了很多时间,最后基于新 nginx 配置文件重写了整个配置,解决了问题.

致谢:

openresty 最佳实践

Nginx 使用 Lua 模块校验 Token

用lua扩展你的Nginx(写的非常好)

nginx 状态码

猜你喜欢

转载自www.cnblogs.com/jonnyan/p/9824264.html