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