• 欢迎访问ByWei.Cn,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,加入百味博客 QQ群
  • 已升级为最新版主题,并将持续优化改造中,支持说说碎语功能,可像添加文章一样直接添加说说,博客主题升级啦
  • 感谢您百度求点赞啊!百度网址
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏百味博客吧
  • 博主热烈欢迎 软件定制开发 联系:http://www.bywei.cn

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

开源软件 bywei 9个月前 (12-18) 4318次浏览 2个评论 扫描二维码

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;
  }
}

 


百味博客 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:基于 Nginx+Lua 模块校验的 Token 认证
喜欢 (1)
[微信扫一扫]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(2)个小伙伴在吐槽
  1. 正在调研中。
    央视财经评论2019-08-22 18:17 回复