基于Nginx+Lua模块校验的Token认证

nginxlua

前言

在使用Nginx实现访问时的Token验证,将会使用到一个基于 Nginx 与 Lua 模块来实现Token的验证。在请求Nginx配置的地址时,将使用Headers传递Token参数,并在Nginx端做网关校验。

环境说明

有两种方式可选择,推荐使用OpenResty简单快捷:

1)使用nginx的lua模块配置环境

  • LuaJIT (下载地址:http://luajit.org/download.html)
  • lua-nginx-module (下载地址:https://github.com/openresty/lua-nginx-module/releases)
  • nginx (下载地址:http://nginx.org/en/download.html)

2)封装过后的高性能 Web 平台 OpenResty

OpenResty 其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

其官网做了更多详细的简介描述:

OpenResty 通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将 Nginx 有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高性能 Web 应用系统。

OpenResty 的目标是让你的Web服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都进行一致的高性能响应。

以上信息参考OpenResty官方中文网站 http://openresty.org/cn/

软件安装

Nginx及模块安装可参阅官方的安装介绍,再此不再重述。
附赠Centos7的简单安装脚本

yum install -y yum-utils
yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo
yum install -y openresty

另Centos7 OpenResty Dockerfile见GitHub: https://github.com/bywei/Centos_OpenResty_Dockerfile

Nginx配置

Nginx的Token校验实现在nginx.conf中配置相应的Lua脚本,编辑Nginx配置文件即可。

vi nginx/conf/nginx.conf

完整的nginx.conf配置文件演示如下,在实际业务场景中通过扩展Lua脚本功能逻辑来实现即可。比如可通过增加Redis来实现Nginx Token权限校验Api网关,具体通过Redis实现权限校验网关,有兴趣的网友可在文章下方评论留言,将附赠Lua实现源码。

#user  nobody;
worker_processes  1;
 
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
 
#pid        logs/nginx.pid;
 
 
events {
    worker_connections  1024;
}
 
 
http {
    include       mime.types;
    default_type  application/octet-stream;
 
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
 
    access_log  logs/access.log  main;
 
    sendfile        on;
    #tcp_nopush     on;
 
    #keepalive_timeout  0;
    keepalive_timeout  65;
 
    #gzip  on;
 
    server {
        listen       80;
        server_name  localhost;
 
        #charset koi8-r;
 
        access_log  logs/access.log;
 
        location / {
            autoindex on;
                autoindex_exact_size off;
                autoindex_localtime on;
                root   /fileroot;
 
            index  index.html index.htm;
            access_by_lua '
              --获取请求的Header参数列表
              local args   = ngx.req.get_headers();
              --提取Header中的token参数,该参数在请求地址时必须加上
              local token1 = args["token"];
              --配置验证的token,此处可增加Redis做存储,然后提取
              local token2 = "f7781231c6f2ea3161sd244453580f73a";
              --token不一致则相应403无权限访问该地址
              if token1 ~= token2 then
                  ngx.exit(ngx.HTTP_FORBIDDEN);
              end
          ';
        }
 
        #通过该地址可测试Lua脚本是否安装成功
        location /lua {
            default_type 'text/html';
            content_by_lua 'ngx.say("hello world");';
        }
 
        #error_page  404              /404.html;
  }
}

 

“基于Nginx+Lua模块校验的Token认证”的2个回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注

20 − 9 =

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据