国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
一. 基礎(chǔ)知識
1.1 同源策略" >1.1 同源策略
1.2 會話機制" >1.2 會話機制
二. 單點登錄
1. 同父域SSO" >1. 同父域SSO
2. 跨域SSO" >2. 跨域SSO
2.1 跨域?qū)慶ookie
2.1.1 利用標(biāo)簽跨域?qū)慶ookie(jsonp)
2.1.2 p3p協(xié)議頭實現(xiàn)IE瀏覽器跨域
2.1.3 url參數(shù)實現(xiàn)跨域信息傳遞
2.2 跨域讀cookie
2.2.1 利用標(biāo)簽跨域讀cookie(jsonp)
3. nodejs實現(xiàn)單點登錄系統(tǒng)實戰(zhàn)
首頁 web前端 js教程 什么是單點登錄系統(tǒng)?用nodejs怎么實現(xiàn)?

什么是單點登錄系統(tǒng)?用nodejs怎么實現(xiàn)?

Feb 24, 2023 pm 07:33 PM
nodejs node 單點登錄系統(tǒng)

什么是單點登錄系統(tǒng)?用nodejs怎么實現(xiàn)?下面本篇文章給大家介紹一下使用node實現(xiàn)單點登錄系統(tǒng)的方法,希望對大家有所幫助!

什么是單點登錄系統(tǒng)?用nodejs怎么實現(xiàn)?

單點登錄SSO(Single Sign On),就是把2個及以上的業(yè)務(wù)系統(tǒng)中的登錄功能剝離出來,形成一個新的系統(tǒng),做到一次登錄后在任意的業(yè)務(wù)系統(tǒng)中都無需登錄的效果。

一. 基礎(chǔ)知識

1.1 同源策略

源 = 協(xié)議 域名 端口

以http://www.a.com為例:

  • https://www.a.com ?(協(xié)議不同)
  • http://www.b.com ?(域名不同)
  • http://www.a.com:3000 ?(端口不同)

同源策略是瀏覽器的行為,它通過確保應(yīng)用下的資源只能被本應(yīng)用訪問,來保證安全。

1.2 會話機制

由于http協(xié)議是無狀態(tài)協(xié)議(客戶端和服務(wù)器端數(shù)據(jù)交換完畢,會關(guān)閉連接,下次請求重新建立連接),但我們需要做記住密碼等功能時,很明顯需要將會話記錄下來?!鞠嚓P(guān)教程推薦:nodejs視頻教程

常用的會話跟蹤就是cookie和session,簡單的理解它們就是可以存放key,value的數(shù)據(jù)結(jié)構(gòu),區(qū)別在于cookie保存在客戶端,session保存在服務(wù)器端。

二. 單點登錄

1. 同父域SSO

同父域,如www.app1.aaa.com,www.app2.aaa.com這兩個服務(wù)器都是在.aaa.com的父域名。
默認情況下,兩個服務(wù)器下頁面之間的cookie是互相訪問不到的。

但是我們可以通過設(shè)置cookie的domain屬性為共通的父域名,使得兩個服務(wù)器下頁面之間的cookie可以相互訪問到。

router.get('/createCookie',?async?(ctx,?next)?=>?{
??ctx.cookies.set('username',?'123',?{
????maxAge:?60?*?60?*?1000,
????httpOnly:?false,
????path:?'/',
????domain:'.a.com'?//設(shè)置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'
??}})

什么是單點登錄系統(tǒng)?用nodejs怎么實現(xiàn)?

2. 跨域SSO

當(dāng)我們的域名為www.a.com,www.b.com時,無論怎樣設(shè)置domain都沒用了。

那么就要想辦法將身份憑證(token)寫入到所有域的cookie中。

2.1 跨域?qū)慶ookie
2.1.1 利用標(biāo)簽跨域?qū)慶ookie(jsonp)

在http://www.a.com/index.js中直接向https://www.c.com:3000/sso直接發(fā)送網(wǎng)絡(luò)請求,是無法跨域?qū)懭隿ookie的。

??<script>
    $.ajax({
      url: &#39;https://www.c.com:3000/sso?key=username&value=123&#39;,
      method: &#39;get&#39;,
    })
  </script>

但是我們可以通過標(biāo)簽發(fā)起跨域請求,寫入cookie

<script></script>

或者使用jquery jsonp的方式發(fā)起跨域請求,寫入cookie,這種方式的原理也是通過標(biāo)簽?zāi)軌蚩缬驅(qū)崿F(xiàn)的。

?$.ajax({
??????url:?'https://www.c.com:3000/sso?key=username&value=123',
??????method:?'get',
??????dataType:'jsonp'
????})

這樣通過標(biāo)簽就實現(xiàn)了往www.a.com中寫入了domain為www.c.com的跨域cookie.
什么是單點登錄系統(tǒng)?用nodejs怎么實現(xiàn)?
后端

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協(xié)議寫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)?發(fā)送,,?且不提供給客戶端?JavaScript?(默認為?true).
????path:?'/',
????sameSite:?'none',?//限制第三方?Cookie
????secure:?true?//cookie是否僅通過?HTTPS?發(fā)送
??});
??ctx.body?=?'create?Cookie?ok'})

注意:

  • 瀏覽器未寫入cookie報錯his set-cookie was blocked due to http-only
    http-only:表示 cookie 是否僅通過 HTTP(S) 發(fā)送,, 且不提供給客戶端 JavaScript (默認為 true).
    所以要將httpOnly設(shè)置為false.

  • 瀏覽器未寫入cookie報錯this set-cookie was blocked due to user preference
    這個真的坑,因為我是無痕模式打開的瀏覽器,但是chrome瀏覽器默認無痕模式下禁用第三方cookie,修改為允許所有cookie就行了.
    什么是單點登錄系統(tǒng)?用nodejs怎么實現(xiàn)?

  • 瀏覽器未寫入cookie報錯this set cookie was blocked because it has the SameSite attribute but Secure not set
    需要設(shè)置sameSite和secure屬性

  • 瀏覽器未寫入cookie報錯server error Error: Cannot send secure cookie over unencrypted connection
    這個我覺得是koa框架寫cookie的限制吧,它只能支持https寫cookie…,于是我把www.c.com改為了https服務(wù)器.

2.1.2 p3p協(xié)議頭實現(xiàn)IE瀏覽器跨域

上面說的jsonp的方式在chrome瀏覽器中完美運行,但是IE瀏覽器對于cookie更加嚴格,只用上面方式無法寫入cookie,解決辦法就是加上p3p的響應(yīng)頭。

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響應(yīng)頭
??ctx.body?=?'create?Cookie?ok'})
2.1.3 url參數(shù)實現(xiàn)跨域信息傳遞

訪問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'})

這樣就實現(xiàn)了跨域信息的傳遞.與上面的方式不同,這種方法只是單純的http請求,適用于所有瀏覽器,但是缺點也很明顯,每次只能分享給一個服務(wù)器。
什么是單點登錄系統(tǒng)?用nodejs怎么實現(xiàn)?

2.2 跨域讀cookie
2.2.1 利用標(biāo)簽跨域讀cookie(jsonp)

之前2.1.1利用標(biāo)簽在www.a.com中寫入了www.c.com的cookie(username,123),現(xiàn)在想要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)})

什么是單點登錄系統(tǒng)?用nodejs怎么實現(xiàn)?
可以看到讀取到了存儲在www.a.com里面domain為www.c.com的cookie.

3. nodejs實現(xiàn)單點登錄系統(tǒng)實戰(zhàn)

什么是單點登錄系統(tǒng)?用nodejs怎么實現(xiàn)?
效果如圖所示:

  • 第一次訪問www.a.com首頁

  • 跳轉(zhuǎn)到www.c.com:3000登錄頁面,登錄成功后跳轉(zhuǎn)www.a.com首頁

  • 再次訪問www.a.com首頁,無需登錄直接跳轉(zhuǎn)

  • 訪問www.b.com首頁,無需登錄直接跳轉(zhuǎn)

源碼: https://github.com/wantao666/sso-nodejs

詳細設(shè)計:
什么是單點登錄系統(tǒng)?用nodejs怎么實現(xiàn)?

更多node相關(guān)知識,請訪問:nodejs 教程!

以上是什么是單點登錄系統(tǒng)?用nodejs怎么實現(xiàn)?的詳細內(nèi)容。更多信息請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻,版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機

Video Face Swap

Video Face Swap

使用我們完全免費的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

熱門話題

Laravel 教程
1601
29
PHP教程
1502
276
nodejs安裝目錄里的npm與npm.cmd文件有什么區(qū)別 nodejs安裝目錄里的npm與npm.cmd文件有什么區(qū)別 Apr 21, 2024 am 05:18 AM

Node.js 安裝目錄中有兩個與 npm 相關(guān)的文件:npm 和 npm.cmd,區(qū)別如下:擴展名不同:npm 是可執(zhí)行文件,npm.cmd 是命令窗口快捷方式。Windows 用戶:npm.cmd 可以在命令提示符下使用,npm 只能從命令行運行。兼容性:npm.cmd 特定于 Windows 系統(tǒng),npm 跨平臺可用。使用建議:Windows 用戶使用 npm.cmd,其他操作系統(tǒng)使用 npm。

Pi Node教學(xué):什么是Pi節(jié)點?如何安裝和設(shè)定Pi Node? Pi Node教學(xué):什么是Pi節(jié)點?如何安裝和設(shè)定Pi Node? Mar 05, 2025 pm 05:57 PM

PiNetwork節(jié)點詳解及安裝指南本文將詳細介紹PiNetwork生態(tài)系統(tǒng)中的關(guān)鍵角色——Pi節(jié)點,并提供安裝和配置的完整步驟。Pi節(jié)點在PiNetwork區(qū)塊鏈測試網(wǎng)推出后,成為眾多先鋒積極參與測試的重要環(huán)節(jié),為即將到來的主網(wǎng)發(fā)布做準(zhǔn)備。如果您還不了解PiNetwork,請參考Pi幣是什么?上市價格多少?Pi用途、挖礦及安全性分析。什么是PiNetwork?PiNetwork項目始于2019年,擁有其專屬加密貨幣Pi幣。該項目旨在創(chuàng)建一個人人可參與

nodejs是后端框架嗎 nodejs是后端框架嗎 Apr 21, 2024 am 05:09 AM

Node.js 可作為后端框架使用,因為它提供高性能、可擴展性、跨平臺支持、豐富的生態(tài)系統(tǒng)和易于開發(fā)等功能。

nodejs可以寫前端嗎 nodejs可以寫前端嗎 Apr 21, 2024 am 05:00 AM

是的,Node.js可用于前端開發(fā),主要優(yōu)勢包括高性能、豐富的生態(tài)系統(tǒng)和跨平臺兼容性。需要考慮的注意事項有學(xué)習(xí)曲線、工具支持和社區(qū)規(guī)模較小。

nodejs中的全局變量有哪些 nodejs中的全局變量有哪些 Apr 21, 2024 am 04:54 AM

Node.js 中存在以下全局變量:全局對象:global核心模塊:process、console、require運行時環(huán)境變量:__dirname、__filename、__line、__column常量:undefined、null、NaN、Infinity、-Infinity

nodejs是后端開發(fā)語言嗎 nodejs是后端開發(fā)語言嗎 Apr 21, 2024 am 05:09 AM

是的,Node.js 是一種后端開發(fā)語言。它用于后端開發(fā),包括處理服務(wù)器端業(yè)務(wù)邏輯、管理數(shù)據(jù)庫連接和提供 API。

nodejs怎么連接mysql數(shù)據(jù)庫 nodejs怎么連接mysql數(shù)據(jù)庫 Apr 21, 2024 am 06:13 AM

要連接 MySQL 數(shù)據(jù)庫,需要遵循以下步驟:安裝 mysql2 驅(qū)動程序。使用 mysql2.createConnection() 創(chuàng)建連接對象,其中包含主機地址、端口、用戶名、密碼和數(shù)據(jù)庫名稱。使用 connection.query() 執(zhí)行查詢。最后使用 connection.end() 結(jié)束連接。

nodejs適合什么項目 nodejs適合什么項目 Apr 21, 2024 am 05:45 AM

Node.js 適用于以下項目類型:網(wǎng)絡(luò)和服務(wù)器應(yīng)用程序事件驅(qū)動應(yīng)用程序?qū)崟r應(yīng)用程序數(shù)據(jù)密集型應(yīng)用程序命令行工具和腳本輕量級微服務(wù)

See all articles