怎麼實現單一登入系統?以下這篇文章跟大家介紹一下使用node實作單一登入系統的方法,希望對大家有幫助!
單一登入SSO(Single Sign On),就是把2個以上的業務系統中的登入功能剝離出來,形成一個新的系統,做到一次登入後在任意的業務系統中都無需登入的效果。
一. 基礎知識
#1.1 同源策略
來源= 協議網域名稱連接埠
以http://www.a.com為例:
- https://www.a.com ❌(協定不同)
- # http://www.b.com ❌(網域不同)
- http://www.a.com:3000 ❌(連接埠不同)
相同策略是瀏覽器的行為,它透過確保應用程式下的資源只能被本應用程式訪問,來保證安全。 【相關教學推薦:nodejs影片教學】
1.2 會話機制
由於http協定是無狀態協定(客戶端和伺服器端資料交換完畢,會關閉連接,下次請求重新建立連接),但我們需要做記住密碼等功能時,很明顯需要將會話記錄下來。
常用的會話追蹤就是cookie和session,簡單的理解它們就是可以存放key,value的資料結構,差別在於cookie保存在客戶端,session保存在伺服器端。
二. 單一登入
1. 同父網域SSO
同父網域,如www.app1.aaa.com
,www.app2.aaa.com
這兩個伺服器都是在.aaa.com的父網域。
預設情況下,兩個伺服器下頁面之間的cookie是互相存取不到的。
但是我們可以透過設定cookie的domain屬性為共通的父網域,使得兩個伺服器下頁面之間的cookie可以互相存取。
router.get('/createCookie', async (ctx, next) => { ctx.cookies.set('username', '123', { maxAge: 60 * 60 * 1000, httpOnly: false, path: '/', domain:'.a.com' //设置domain为共通的父域名 }); ctx.body = "create cookie ok"})router.get('/getCookie', async (ctx, next) => { let username=ctx.cookies.get('username') if (username){ ctx.body=username }else{ ctx.body='no cookie' }})
2.跨域SSO
當我們的網域為www.a .com
,www.b.com
時,無論怎樣設定domain都沒用了。
那麼就要想辦法將身分憑證(token)寫入到所有網域的cookie中。
2.1 跨域寫cookie
2.1.1 利用標籤跨域寫cookie(jsonp)
在http://www.a.com/index.js中直接向https://www.c.com:3000/sso直接發送網路請求,是無法跨網域寫入cookie的。
<script> $.ajax({ url: 'https://www.c.com:3000/sso?key=username&value=123', method: 'get', }) </script>
但是我們可以透過標籤發起跨域請求,寫入cookie
<script></script>
或使用jquery jsonp的方式發起跨域請求,寫入cookie,這種方式的原理也是透過標籤能夠跨域實現的。
$.ajax({ url: 'https://www.c.com:3000/sso?key=username&value=123', method: 'get', dataType:'jsonp' })
這樣透過標籤就實現了往www.a.com中寫入了domain為www.c.com的跨域cookie.
#後端
const options = { key: fs.readFileSync(path.join(__dirname, './https/privatekey.pem')), cert: fs.readFileSync(path.join(__dirname, './https/certificate.pem')), secureOptions: 'TLSv1_2_method' //force TLS version 1.2}var server = https.createServer(options,app.callback()); //只能使用https协议写cookierouter.get('/sso', async (ctx, next) => { let { key, value } = ctx.request.query ctx.cookies.set(key, value, { maxAge: 60 * 60 * 1000, //有效时间,单位毫秒 httpOnly: false, //表示 cookie 是否仅通过 HTTP(S) 发送,, 且不提供给客户端 JavaScript (默认为 true). path: '/', sameSite: 'none', //限制第三方 Cookie secure: true //cookie是否仅通过 HTTPS 发送 }); ctx.body = 'create Cookie ok'})
注意:
#瀏覽器未寫入cookie報錯
his set-cookie was blocked due to http-only
http-only:表示cookie 是否僅透過HTTP(S) 傳送,, 且不提供給客戶端JavaScript (預設為true).
所以要將httpOnly設定為false.瀏覽器未寫入cookie報錯
this set-cookie was blocked due to user preference
這個真的坑,因為我是無痕模式開啟的瀏覽器,但chrome瀏覽器預設無痕模式下停用第三方cookie,修改為允許所有cookie就行了.#瀏覽器未寫入cookie報錯
this set cookie was blocked because it has the SameSite attribute but Secure not set
需要設定sameSite和secure屬性#瀏覽器未寫入cookie錯誤封包error Error: Cannot send secure cookie over unencrypted connection
這我覺得是koa框架寫cookie的限製吧,它只能支援https寫cookie…,於是我把www.c.com改為了https伺服器.
2.1.2 p3p協定頭實作IE瀏覽器跨域
上面所說的jsonp的方式在chrome瀏覽器中完美運行,但是IE瀏覽器對於cookie更加嚴格,只用上面方式無法寫入cookie,解決方法就是加上p3p的回應頭。router.get('/sso', async (ctx, next) => { let { key, value } = ctx.request.query ctx.cookies.set(key, value, { maxAge: 60 * 60 * 1000, //有效时间,单位毫秒 httpOnly: false, path: '/', sameSite: 'none', secure: true }); ctx.set("P3P", "CP='CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR'") //p3p响应头 ctx.body = 'create Cookie ok'})
2.1.3 url参数实现跨域信息传递
访问http://www.c.com:3000/createToken?from=http://www.a.com/createCookie
www.c.com上生成token后将url重写,带上token,重定向到www.a.com
router.get('/createToken', async (ctx, next) => { let { from } = ctx.request.query let token = "123"; ctx.response.redirect(`${from}?token=${token}`)})
www.a.com上从url上获取token,存入cookie
router.get('/createCookie', async (ctx, next) => { let { token } = ctx.request.query ctx.cookies.set('token', token, { maxAge: 60 * 60 * 1000, //有效时间,单位毫秒 httpOnly: false, path: '/', }); ctx.body = 'set cookie ok'})
这样就实现了跨域信息的传递.与上面的方式不同,这种方法只是单纯的http请求,适用于所有浏览器,但是缺点也很明显,每次只能分享给一个服务器。
2.2 跨域读cookie
2.2.1 利用标签跨域读cookie(jsonp)
之前2.1.1利用标签在www.a.com中写入了www.c.com的cookie(username,123),现在想要www.a.com请求的时候携带上www.c.com的cookie,也就是说要跨域读cookie.
其实也是同样的方法,在www.a.com上利用跨域访问访问www.c.com,会自动的带上domain为www.c.com的cookie。www.a.com/index.js
<script></script>
www.c.com
router.get('/readCookie', async (ctx, next) => { let username = ctx.cookies.get('username') console.log('cookie', username)})
可以看到读取到了存储在www.a.com里面domain为www.c.com的cookie.
3. nodejs实现单点登录系统实战
效果如图所示:
第一次访问www.a.com首页
跳转到www.c.com:3000登录页面,登录成功后跳转www.a.com首页
再次访问www.a.com首页,无需登录直接跳转
访问www.b.com首页,无需登录直接跳转
源码: https://github.com/wantao666/sso-nodejs
详细设计:
更多node相关知识,请访问:nodejs 教程!
以上是淺析node怎麼實現單一登入系統的詳細內容。更多資訊請關注PHP中文網其他相關文章!

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

Python更适合数据科学和机器学习,JavaScript更适合前端和全栈开发。1.Python以简洁语法和丰富库生态著称,适用于数据分析和Web开发。2.JavaScript是前端开发核心,Node.js支持服务器端编程,适用于全栈开发。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

WebStorm Mac版
好用的JavaScript開發工具

禪工作室 13.0.1
強大的PHP整合開發環境

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

Atom編輯器mac版下載
最受歡迎的的開源編輯器

Dreamweaver CS6
視覺化網頁開發工具