亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄
一. 基礎(chǔ)知識(shí)
1.1 同源策略" >1.1 同源策略
1.2 會(huì)話機(jī)制" >1.2 會(huì)話機(jī)制
二. 單點(diǎn)登錄
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é)議頭實(shí)現(xiàn)IE瀏覽器跨域
2.1.3 url參數(shù)實(shí)現(xiàn)跨域信息傳遞
2.2 跨域讀cookie
2.2.1 利用標(biāo)簽跨域讀cookie(jsonp)
3. nodejs實(shí)現(xiàn)單點(diǎn)登錄系統(tǒng)實(shí)戰(zhàn)
首頁 web前端 js教程 什么是單點(diǎn)登錄系統(tǒng)?用nodejs怎么實(shí)現(xiàn)?

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

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

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

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

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

一. 基礎(chǔ)知識(shí)

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 會(huì)話機(jī)制

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

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

二. 單點(diǎn)登錄

1. 同父域SSO

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

但是我們可以通過設(shè)置cookie的domain屬性為共通的父域名,使得兩個(gè)服務(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'
??}})

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

2. 跨域SSO

當(dāng)我們的域名為www.a.com,www.b.com時(shí),無論怎樣設(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ǐng)求,是無法跨域?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ā)起跨域請(qǐng)求,寫入cookie

<script></script>

或者使用jquery jsonp的方式發(fā)起跨域請(qǐng)求,寫入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)簽就實(shí)現(xiàn)了往www.a.com中寫入了domain為www.c.com的跨域cookie.
什么是單點(diǎn)登錄系統(tǒng)?用nodejs怎么實(shí)現(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,?//有效時(shí)間,單位毫秒
????httpOnly:?false,?//表示?cookie?是否僅通過?HTTP(S)?發(fā)送,,?且不提供給客戶端?JavaScript?(默認(rèn)為?true).
????path:?'/',
????sameSite:?'none',?//限制第三方?Cookie
????secure:?true?//cookie是否僅通過?HTTPS?發(fā)送
??});
??ctx.body?=?'create?Cookie?ok'})

注意:

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

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

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

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

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

上面說的jsonp的方式在chrome瀏覽器中完美運(yùn)行,但是IE瀏覽器對(duì)于cookie更加嚴(yán)格,只用上面方式無法寫入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,?//有效時(shí)間,單位毫秒
????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ù)實(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,?//有效時(shí)間,單位毫秒
????httpOnly:?false,
????path:?'/',
??});
??ctx.body?=?'set?cookie?ok'})

這樣就實(shí)現(xiàn)了跨域信息的傳遞.與上面的方式不同,這種方法只是單純的http請(qǐng)求,適用于所有瀏覽器,但是缺點(diǎn)也很明顯,每次只能分享給一個(gè)服務(wù)器。
什么是單點(diǎn)登錄系統(tǒng)?用nodejs怎么實(shí)現(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請(qǐng)求的時(shí)候攜帶上www.c.com的cookie,也就是說要跨域讀cookie.

其實(shí)也是同樣的方法,在www.a.com上利用跨域訪問訪問www.c.com,會(huì)自動(dòng)的帶上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)})

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

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

什么是單點(diǎn)登錄系統(tǒng)?用nodejs怎么實(shí)現(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

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

更多node相關(guān)知識(shí),請(qǐng)?jiān)L問:nodejs 教程

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

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

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

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

Dreamweaver CS6

Dreamweaver CS6

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

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

nodejs安裝目錄里的npm與npm.cmd文件有什么區(qū)別 nodejs安裝目錄里的npm與npm.cmd文件有什么區(qū)別 Apr 21, 2024 am 05:18 AM

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

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

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

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

Node.js 可作為后端框架使用,因?yàn)樗峁└咝阅?、可擴(kuò)展性、跨平臺(tái)支持、豐富的生態(tài)系統(tǒng)和易于開發(fā)等功能。

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

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

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

Node.js 中存在以下全局變量:全局對(duì)象:global核心模塊:process、console、require運(yùn)行時(shí)環(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ù)庫(kù)連接和提供 API。

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

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

nodejs適合什么項(xiàng)目 nodejs適合什么項(xiàng)目 Apr 21, 2024 am 05:45 AM

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

See all articles