1. 程式人生 > >nginx+lua+redis實現token驗證

nginx+lua+redis實現token驗證

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失效