searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

nginx实现token验证的两种方式

2023-05-26 02:31:05
1077
0

token一般用于身份验证流程中。而实现nginx的token验证通常可通过nginx的模块化开发或通过基于nginx+lua的openresty来实现。本文将介绍两种方式来实现基于nginx的静态token验证。

 

一、基于nginx+lua的openresty来实现

 

1、安装lua-nginx-module模块

wget https://github.com/openresty/lua-nginx-module/archive/v0.10.13.tar.gz

tar zxvf v0.10.13.tar.gz

注意安装lua-nginx-module模块后不需要编译,解压即可

2、安装LuaJIT

wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz

tar -zxvf LuaJIT-2.0.5.tar.gz

cd LuaJIT-2.0.5

make install perfix=/usr/local/LuaJIT

若安装成功,则提示

==== Successfully installed LuaJIT 2.0.5 to /usr/local/LuaJIT ====

在安装成功后,需要在解压文件中的/etc/profile路径中修改profile文件

在文件最后加上环境变量即可:

export LUAJIT_LIB=/usr/local/LuaJIT/lib

export LUAJIT_INC=/usr/local/LuaJIT/include/luajit-2.0

修改环境变量,并保存后执行命令:

source /etc/profile

 

3、安装ngx_devel_kit

与安装lua-nginx-module模块相同,下载后解压即可,无需安装:

cd /opt/

wget https://github.com/simplresty/ngx_devel_kit/archive/v0.3.0.tar.gz

tar zxvf v0.3.0.tar.gz

 

4、直接安装openresty

在终端执行下面 3 条命令把 OpenResty 安装到 /usr/local/openresty

sudo yum install yum-utils

sudo yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo

sudo yum install openresty
  • Nginx 的配置文件位于 /usr/local/openresty/nginx/conf/nginx.conf (openresty -V 中没有指定)

  • 启动 Nginx,2 种启动方式都可以

    • sudo openresty

    • sudo nginx

    • 查看是否启动了 nginx: ps -ef | grep nginx

  • 测试是否支持 Lua: 参考上面的方法

 

 

5、编译nginx

本文默认已经安装了Nginx,所以在编译时(./configure),只追加以下新参数:

--with-ld-opt=-Wl,-rpath,/usr/local/LuaJIT/lib --add-module=/root/test_for_token/ngx_devel_kit-0.3.0 --add-module=/root/test_for_token/lua-nginx-module-0.10.13

编译nginx的同时,分别将已下载的lua-nginx-module模块、LuaJIT模块、ngx_devel_kit模块增加进去。随后进行编译安装:

$ make -j2
$ make install

 

6、测试lua-nginx-module

在nginx.conf文件中的server代码块里加入如下代码:

location /hello_lua { 
   default_type 'text/plain';
   content_by_lua 'ngx.say("hello, lua!")';
}

重启nginx后,通过curl进行测试:

curl http://127.0.0.1/hello_lua

若结果为hello, lua! 则安装成功。

 

7、在nginx.conf文件中配置静态token

location /a/b/c {
access_by_lua '
local args = ngx.req.get_headers(); --获取请求中 header 头的列表.
local token1 = args["token"];   --取出 header 头中key为 token 的值.
local token2 = "123456";  --定义一个局部变量.
local errs = "Only Authorized Request will be Processe"  --定义错误提示消息
local errs2 = "The token value is incorrect."
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(errs2)
ngx.exit(200)
else
return
end
';
proxy_pass XXXX;
}

重启nginx后,在发送http请求时,需要URI中添加token=123456,进行校验后nginx才可进行请求处理。

 

二、基于nginx模块化开发实现token验证

基于nginx模块化开发实现静态token验证的基本思路是通过在nginx.conf配置文件中的server模块添加参数,如:

server {
       listen 80;
       server_name test;
       token_key token_value;
}

并通过ngx_command_t中的ngx_http_set_token_key(根据不同需求提供读取配置函数),对配置文件nginx.conf中的静态的token值进行读取,如下所示:

{ ngx_string("token_key"),
 NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
ngx_http_set_token_key,
NGX_HTTP_SRV_CONF_OFFSET,
0,
 NULL },

每当获得http请求时,通过对ngx_http_core_loc_conf_t模块化开发的handler中,对比请求参数token_key的值。若无该参数,或者该参数的值与nginx.conf文件中的值不匹配,则返回 NGX_HTTP_FORBIDDEN,即返回403,提示禁止访问,具体实现如下:

if(NGX_OK != ngx_http_arg(r,(u_char *)"token_key", 9, &token_key)){
ngx_log_error(NGX_LOG_ERR,/*log*/, 0,
                "Only token Request will be Processe");
return NGX_HTTP_FORBIDDEN;
}else if (ngx_strncmp(token_key.data,/*配置文件中的token_value*/, /*token_value长度*/) != 0)
{
ngx_log_error(NGX_LOG_ERR, /*log*/, 0,"token check failed");
return NGX_HTTP_FORBIDDEN;
}
0条评论
0 / 1000
song
1文章数
0粉丝数
song
1 文章 | 0 粉丝