nginx+lua+redis實現token驗證
阿新 • • 發佈:2019-01-09
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.原始碼下載
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失效 |