基于nginx的token认证

时间:2024-09-02 23:05:08

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

  • 环境: centos 7
  • 部署方式: 增量部署(不影响原 nginx 版本)
  • 版本: openresty/1.13.6.2
  • 启动命令:1.原版本通过nginx命令启动.

    2.新版本通过openresty命令启动.

需求:

对指定域名增加 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 状态码