nginx+lua+redis实现token验证

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010277446/article/details/82891969

token有效验证

前言

token系统,之前应项目需求写了token验证系统。基于nginx+lua+redis,通过redis设置token时效性来控制token的可用性。是一个完整的token系统,包含登录验证、token生成、token时效性控制、token验证、反向代理转发内部服务等功能。
此文并不打算封装完整的一个系统,因为后面小生在有空没事设计系统玩的时候,希望兼容第三方平台登录时,发现大多第三方都是有自己的一套登录授权与换取openid(或其他唯一的身份id)机制。此时如果多个第三方的登录由于差异性,又要在lua上去兼容和实现的话,显得很繁琐且扩展性不高。
故,此文只抽取了其中的token验证功能。

环境

  • openresty(自带ngx_lua模块)
  • redis
  • linux或其他服务主机

一、基本设计思路

  • 前端在请求头设置用户token,
  • nginx上通过lua获取token,配合redis验证并转换成系统用户的userid
  • 重写请求头再转发请求至内部服务。

二、redis设计

1.用户ID->Token对应关系

userid=> token (hash)

userid_(userid): {
  token:(token)
}

2.Token->用户ID对应关系

token=>userid

token_(token): {
  userid:(userid)
}

Nginx+Lua+Redis实现token验证

1.lua脚本目录结构

lmc:tokenGateway chao$ tree lua/
lua/
├── auth_req_headers.lua  # 请求头校验脚本,失败直接中断请求403
├── auth_token.lua  # token处理脚本
├── handlefile
│   ├── handle_cors.lua # 请求跨域脚本
│   └── handle_request_provision.lua # 请求handle入口脚本
├── redis_mcredis.lua # redis操作工具封装(基本来自网络佚名前辈们封装,小生只是稍加修改,增加了redis域名解析,感谢前辈们的付出)
└── tool_dns_server.lua # 域名解析,获取域名对应的ip,并设置缓存

1 directory, 6 files

2.源码下载

https://download.csdn.net/download/u010277446/10694569

3.nginx配置

  • nginx.conf
worker_processes  1; 
error_log logs/error.log info; 

events {
	worker_connections 1024;
}

upstream iotserver{
	server unix:/run/gunicorn/iot.sock fail_timeout=0;
}

http {
	# lua custom path, use absolute path please.
	lua_package_path "/etc/nginx/lua/?.lua;;";

	server {
		listen 8080;
		access_log logs/access.log;
		location @auth_success{
			proxy_set_header Host $http_host;
			proxy_pass  http://iotserver;
		}

		location / {
			# CORS
			header_filter_by_lua_file /etc/nginx/lua/handlefile/handle_cors.lua;
			if ($request_method = 'OPTIONS') {
						return 204;
			}
			
			access_by_lua_file /etc/nginx/lua/handlefile/handle_request_provision.lua;
		}
	}
}

  • token验证失败错误码
错误码 描述
-1 系统错误
10001 token失效

猜你喜欢

转载自blog.csdn.net/u010277446/article/details/82891969