nginx lua實現登陸驗證

2021-08-15 21:03:11 字數 3912 閱讀 4783

用於在多台伺服器上單點登入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進行登陸,可以採用密碼登陸和秘鑰登陸。採用密碼登陸每次需要輸入密碼進行驗證,驗證通過則可登陸到環境。秘鑰登陸為在伺服器的客戶端生成相應的公鑰和私鑰,公鑰用於加密,私鑰用於解密。然後將公鑰發給需要連線的服務端。當客戶端需要連線服務端時,服務端利用公鑰將使用者名稱和密碼加密傳送給...