用於在多台伺服器上單點登入sso、無session,使用者身份的驗證。
1、安裝lua
yum install readline.x86_64 readline-devel.x86_64
wget
make linux
make install
注意:不要使用5.2版本,5.2版本的lua和nginx的整合有問題,編譯會報錯:
lua_globalsindex' undeclared (first use in this function)
參考:2、編譯nginx
wget
file master
unzip master
mv chaoslawful-lua-nginx-module-06d654b/ lua-nginx-module
file master
unzip master
mv simpl-ngx_devel_kit-4192ba6/ simpl-ngx_devel_kit
編譯nginx
2、測試lua
測試location = /lua
3、登入驗證
nginx新增配置
access_by_lua_file 'conf/access.lua';
access.lua:
可以根據需要新增更多的驗證域
local secretkey='1234567890abcdefghi'
if ngx.var.cookie_uid == nil or ngx.var.cookie_token == nil then
ngx.req.set_header("check-login", "null")
return
end--local ctoken = ngx.md5('uid:' .. ngx.var.cookie_uid .. '&secretkey:' .. secretkey)
local ctoken = ngx.md5(ngx.var.cookie_uid .. secretkey)
if ctoken == ngx.var.cookie_token then
ngx.req.set_header("check-login", "yes")
else
ngx.req.set_header("check-login", "no")
endreturn
如果uid+lua中的securekey的md5值和請求中的cookie的值一致,則設定request header中的http_check_login為yes,否則為no,如果不存在uid或token這兩個cookie中的乙個,則http_check_login設定為null。
關於 check-login,
lua中設定的heaer為
check-login,輸出後就變成了http_check_login,即前面加了http_,經過測試,有些會新增http_,而有些則不會新增,如
content-type。
詳細資訊檢視:
4、測試
使用perl cgi
perl列印env
#!/usr/bin/perl -w
use strict;
use cgi;
use data::dumper;
my $query = new cgi;
print $query-
>header(
'text/html');
print dumper \%env;
#if (
$env ne "yes"
)列印\%env雜湊可以看到我們新增的header。
注釋部分是乙個例子,針對認證的結果做更多的操作。
可以使用curl來帶著cookie進行測試:
curl -b "uid=1234;token=8323d8c4a0533dc78c7051a074cdb286"
如果使用echo 列印md5值,需要使用-n引數去掉回車
echo -n 123456789|md5sum
如何檢視lua生成的md5?
location = /lua
關於檢視access.lua生成的cookie
local secretkey='cookiesecretkey'
if ngx.var.cookie_uid == nil or ngx.var.cookie_token == nil then
ngx.req.set_header("check-login", "null")
return
end--local ctoken = ngx.md5('uid:' .. ngx.var.cookie_uid .. '&secretkey:' .. secretkey)
local ctoken = ngx.md5(ngx.var.cookie_uid .. secretkey)
if ctoken == ngx.var.cookie_token then
ngx.req.set_header("check-login", "yes")
print (ctoken)
print (ngx.var.cookie_token)
else
ngx.req.set_header("check-login", "no")
print (ctoken)
print (ngx.var.cookie_token)
endreturn
開啟nginx的log到debug,從error裡可以看到access.lua的輸出
通過html種植cookie
登陸驗證機制
做過web開發的程式設計師應該對session都比較熟悉,session是一塊儲存在伺服器端的記憶體空間,一般用於儲存使用者的會話資訊。使用者通過使用者名稱和密碼登陸成功之後,伺服器端程式會在伺服器端開闢一塊session記憶體空間並將使用者的資訊存入這塊空間,同時伺服器會 在cookie中寫入乙個...
PHP實現登陸驗證碼
使用php實現登入驗證碼原理 生成乙個,並且儲存中顯示的字元到session.在登陸時判斷輸入的校驗碼是否和session中校驗碼相同.以下是生成校驗碼和的檔案checknumber.php session start if act init 使用方法 在html檔案中加入 在登陸校驗php頁面中加...
ssh登陸強制使用密碼驗證登陸
linux系統使用ssh進行登陸,可以採用密碼登陸和秘鑰登陸。採用密碼登陸每次需要輸入密碼進行驗證,驗證通過則可登陸到環境。秘鑰登陸為在伺服器的客戶端生成相應的公鑰和私鑰,公鑰用於加密,私鑰用於解密。然後將公鑰發給需要連線的服務端。當客戶端需要連線服務端時,服務端利用公鑰將使用者名稱和密碼加密傳送給...