摘要:用戶通過(guò)此即可獲得服務(wù)器的認(rèn)可授權(quán)。同時(shí),此方案可以對(duì)同一域名下的不同子域名中的內(nèi)容進(jìn)行訪問(wèn)限制。注意事項(xiàng)設(shè)置的時(shí),由于本案例中使用了不同的子域名及,需要特別設(shè)置的項(xiàng),如下所示其中的格式為。
本文的內(nèi)容是我的開源代碼(https://github.com/e10101/AdminLogin)的中文說(shuō)明。
項(xiàng)目主要是實(shí)現(xiàn)了通過(guò)合理配置Nginx的auth_request模塊來(lái)實(shí)現(xiàn)對(duì)敏感路徑下的內(nèi)容進(jìn)行訪問(wèn)限制。
可通過(guò)Github訪問(wèn):https://github.com/e10101/AdminLogin,來(lái)獲取代碼。如果可以的話,可以Star一下。
開發(fā)初衷這個(gè)項(xiàng)目是為了解決網(wǎng)站中部分管理資源(路徑)需要進(jìn)行權(quán)限限制,但又不想通過(guò)復(fù)雜系統(tǒng)去實(shí)現(xiàn)而進(jìn)行編寫的項(xiàng)目.
同時(shí)這個(gè)項(xiàng)目也沒(méi)有采用Nginx的auth_basic模塊來(lái)實(shí)現(xiàn)權(quán)限限制.二是通過(guò)auth_request來(lái)進(jìn)行的權(quán)限限制.
結(jié)構(gòu)框架本項(xiàng)目是基于NodeJS/ExpressJS/PassportJS以及Github的。
為講解方便,假設(shè)存在:
服務(wù)器A(server1.example.com),其路徑/installs上存有敏感信息,其他路徑可公開訪問(wèn),端口3003。
服務(wù)器B(login.example.com),為認(rèn)證服務(wù)器,其上部署了本項(xiàng)目代碼,端口4001。
系統(tǒng)以CentOS7.2為例,認(rèn)證使用的Github用戶認(rèn)證。
示意配置服務(wù)器A(server1)的Nginx配置文件
server { listen 80; listen [::]:80; server_name server1.example.com; location = /auth { internal; proxy_pass http://login.example.com; proxy_pass_request_body off; proxy_set_header X-Original-URI $request_uri; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } error_page 401 = @error401; location @error401 { return 302 http://login.example.com; } location / { try_files $uri $uri/ @proxy; } # The path has secret content location /installs { auth_request /auth; try_files $uri $uri/ @proxy; } location @proxy { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Proto https; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Host $remote_addr; proxy_pass http://127.0.0.1:3003; } }
服務(wù)器B(login)的Nginx配置
server { listen 80; listen [::]:80; server_name login.example.com; location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Proto https; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Host $remote_addr; proxy_pass http://127.0.0.1:4001/; } }基本流程
用戶訪問(wèn)服務(wù)器A的敏感資源(即路徑/installs中的內(nèi)容),Nginx通過(guò)配置文件中的auth_request字段去請(qǐng)求http://login.example.com/auth,由于用戶并未在服務(wù)器B進(jìn)行登錄,因此服務(wù)器B返回了401無(wú)權(quán)限的錯(cuò)誤。
根據(jù)服務(wù)器A的配置,發(fā)現(xiàn)401錯(cuò)誤后,會(huì)向用戶返回302狀態(tài)指向?yàn)榉?wù)器B的主機(jī)地址(login.example.com)。
用戶瀏覽器跳轉(zhuǎn)到服務(wù)器B,并選擇第三方的用戶認(rèn)證進(jìn)行授權(quán)(此處以Github為例),當(dāng)用戶通過(guò)Github進(jìn)行授權(quán)后,回向服務(wù)器B返回用戶的個(gè)人信息。
服務(wù)器B從第三方反饋回的信息中,檢索出用戶的用戶名(username),然后服務(wù)器B會(huì)將此用戶名與已有的管理員信息進(jìn)行對(duì)比(此處通過(guò)配置文件實(shí)現(xiàn)),如果登錄用戶為合法的管理員賬號(hào),則服務(wù)器B授權(quán)其登錄進(jìn)入。如果為非法用戶,則不對(duì)其授權(quán),因此非法用戶無(wú)法獲得有效登錄憑證。
如果用戶為合法用戶:
那么服務(wù)器B將會(huì)生成session,并通過(guò)Set-cookie命令告知用戶瀏覽器。用戶通過(guò)此Cookie即可獲得服務(wù)器B的認(rèn)可授權(quán)。當(dāng)用戶通過(guò)此Cookie訪問(wèn)服務(wù)器B中的/auth目錄時(shí),會(huì)返回200的狀態(tài)碼。
如果用戶為非法用戶:
那么服務(wù)器B將不會(huì)session,由于用戶無(wú)法獲得認(rèn)可的Cookie,那么當(dāng)用戶再次訪問(wèn)/auth的路徑時(shí),服務(wù)器會(huì)返回401錯(cuò)誤。
假設(shè)用戶已經(jīng)授權(quán)成功,那么當(dāng)用戶訪問(wèn)服務(wù)器A中的敏感內(nèi)容/installs時(shí),服務(wù)器A訪問(wèn)服務(wù)器B的/auth路徑,此時(shí)返回200狀態(tài)碼,服務(wù)器A則允許用戶進(jìn)行訪問(wèn)。
以上,通過(guò)auth_request模塊以及相關(guān)配置就實(shí)現(xiàn)了對(duì)敏感內(nèi)容的訪問(wèn)限制。而且通過(guò)第三方的機(jī)制,也無(wú)需自己手工實(shí)現(xiàn)登錄功能。同時(shí),此方案可以對(duì)同一域名下的不同子域名中的內(nèi)容進(jìn)行訪問(wèn)限制??梢灾貜?fù)利用一個(gè)登錄系統(tǒng),服務(wù)于多個(gè)其他系統(tǒng)。
注意事項(xiàng)
設(shè)置Express的session時(shí),由于本案例中使用了不同的子域名(server1.example.com及l(fā)ogin.example.com),需要特別設(shè)置cookie的domain項(xiàng),如下所示:
app.use(session({ secret: config.session.secret, cookie: { path: config.cookie.path, domain: config.cookie.domain, maxAge: config.cookie.maxAge } }));
其中的domain格式為:.example.com。
關(guān)于為何使用Github的問(wèn)題。
國(guó)內(nèi)可以訪問(wèn)(此項(xiàng)排除了Facebook,Google,Twitter等);
創(chuàng)建應(yīng)用簡(jiǎn)單無(wú)需審核(此項(xiàng)排除了微信,微博等)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/79993.html
摘要:用戶通過(guò)此即可獲得服務(wù)器的認(rèn)可授權(quán)。同時(shí),此方案可以對(duì)同一域名下的不同子域名中的內(nèi)容進(jìn)行訪問(wèn)限制。注意事項(xiàng)設(shè)置的時(shí),由于本案例中使用了不同的子域名及,需要特別設(shè)置的項(xiàng),如下所示其中的格式為。 本文的內(nèi)容是我的開源代碼(https://github.com/e10101/AdminLogin)的中文說(shuō)明。項(xiàng)目主要是實(shí)現(xiàn)了通過(guò)合理配置Nginx的auth_request模塊來(lái)實(shí)現(xiàn)對(duì)敏感路徑...
摘要:考慮到這一點(diǎn),我們花費(fèi)了一些時(shí)間審查了我們維護(hù)的多種系統(tǒng),并在這星期,我給我們的私人注冊(cè)中心設(shè)置了添加身份認(rèn)證的目標(biāo)。你也許知道,注冊(cè)沒(méi)有提供身份認(rèn)證的方法。授權(quán)響應(yīng)觸發(fā)客戶端回應(yīng)一組使用基本身份驗(yàn)證的憑據(jù)。 注:原文作者是 Alex Ianchici,原文地址是 Docker private registry authentication 安全已經(jīng)融入了我們的生活。我們鎖門...
摘要:考慮到這一點(diǎn),我們花費(fèi)了一些時(shí)間審查了我們維護(hù)的多種系統(tǒng),并在這星期,我給我們的私人注冊(cè)中心設(shè)置了添加身份認(rèn)證的目標(biāo)。你也許知道,注冊(cè)沒(méi)有提供身份認(rèn)證的方法。授權(quán)響應(yīng)觸發(fā)客戶端回應(yīng)一組使用基本身份驗(yàn)證的憑據(jù)。 注:原文作者是 Alex Ianchici,原文地址是 Docker private registry authentication 安全已經(jīng)融入了我們的生活。我們鎖門...
摘要:最近做項(xiàng)目,遇到單點(diǎn)登錄,方法是在前端做代理。調(diào)通之后開始思考如何在本地開發(fā)環(huán)境調(diào)試單點(diǎn)登錄這一功能。 最近做項(xiàng)目,遇到單點(diǎn)登錄,方法是在前端做nginx代理。應(yīng)用系統(tǒng)需要配合做如下調(diào)整:1、使用*.頂級(jí)域名訪問(wèn),確保可以和KAM共享cookie2、對(duì)來(lái)自Nginx代理的訪問(wèn)放開登錄認(rèn)證(安全起見(jiàn),對(duì)來(lái)自其他IP的訪問(wèn)應(yīng)該禁止)3、應(yīng)用系統(tǒng)從請(qǐng)求頭kam_remote_user中讀取登...
摘要:由于服務(wù)器配置了的反向代理,在中無(wú)法獲取到真實(shí)的地址。本文就介紹了如何配置以及使其可以顯示用戶的真實(shí)地址。中的設(shè)置在中的靠前位置,添加搞定通過(guò)上述的設(shè)置,現(xiàn)在你使用或就可以獲取到用戶真實(shí)的地址了。資料官網(wǎng)關(guān)于的文檔介紹中設(shè)置的文章 由于服務(wù)器配置了Nginx的反向代理,在ExpressJS中無(wú)法獲取到真實(shí)的IP地址。本文就介紹了如何配置Nginx以及ExpressJS使其可以顯示用戶的...
閱讀 3980·2021-11-23 10:09
閱讀 1344·2021-11-23 09:51
閱讀 2944·2021-11-23 09:51
閱讀 1590·2021-09-07 09:59
閱讀 2357·2019-08-30 15:55
閱讀 2301·2019-08-30 15:55
閱讀 2953·2019-08-30 15:52
閱讀 2565·2019-08-26 17:04