gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

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

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

什么是單點(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ǔ)知識

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

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

常用的會話跟蹤就是cookie和session,簡單的理解它們就是可以存放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'   }})
登錄后復(fù)制

什么是單點(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 利用< script />標(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: 'https://www.c.com:3000/sso?key=username&value=123',       method: 'get',     })   </script>
登錄后復(fù)制

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

<script src="https://www.c.com:3000/sso?key=username&value=123"></script>
登錄后復(fù)制

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

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

這樣通過< script />標(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'})
登錄后復(fù)制

注意:

  • 瀏覽器未寫入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瀏覽器對于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'})
登錄后復(fù)制

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}`)})
登錄后復(fù)制

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'})
登錄后復(fù)制

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

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

之前2.1.1利用< script />標(biāo)簽在www.a.com中寫入了www.c.com的cookie(username,123),現(xiàn)在想要www.a.com請求的時(shí)候攜帶上www.c.com的cookie,也就是說要跨域讀cookie.

其實(shí)也是同樣的方法,在www.a.com上利用< script />跨域訪問訪問www.c.com,會自動(dòng)的帶上domain為www.c.com的cookie。
www.a.com/index.js

<script src="https://www.c.com:3000/readCookie"></script>
登錄后復(fù)制

www.c.com

router.get('/readCookie', async (ctx, next) => {   let username = ctx.cookies.get('username')   console.log('cookie', username)})
登錄后復(fù)制

什么是單點(diǎn)登錄系統(tǒng)?用nodejs怎么實(shí)現(xiàn)?
可以看到讀取到了存儲在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)?

贊(0)
分享到: 更多 (0)
網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
超碰在线超碰在线| 免费看日b视频| 国产在线观看福利| 日本xxxx黄色| 亚洲综合在线网站| 凹凸日日摸日日碰夜夜爽1| 亚洲熟妇国产熟妇肥婆| 人妻av中文系列| 欧美成人高潮一二区在线看| 日本xxxxx18| 国产精品视频一二三四区| 操bbb操bbb| 免费拍拍拍网站| www.爱色av.com| 日韩毛片在线免费看| 北条麻妃视频在线| 久久婷婷综合色| 亚洲精品在线网址| 中国一级大黄大黄大色毛片| 97av中文字幕| 人妻少妇被粗大爽9797pw| 毛片一区二区三区四区| 五月天婷婷激情视频| 欧美激情第3页| 浴室偷拍美女洗澡456在线| 特级西西444| 国产二区视频在线播放| 亚洲国产精品三区| ijzzijzzij亚洲大全| 人妻夜夜添夜夜无码av| 一级黄色香蕉视频| 懂色av粉嫩av蜜臀av| 日日鲁鲁鲁夜夜爽爽狠狠视频97 | 性欧美videossex精品| 日日噜噜噜夜夜爽爽| 成人免费观看在线| 天天干天天玩天天操| www.亚洲视频.com| 五月激情婷婷在线| 日韩av综合在线观看| 亚洲最大天堂网| 免费看日本毛片| 国产精品美女在线播放| 黄色片一级视频| 亚洲中文字幕无码一区二区三区| 成人免费xxxxx在线视频| 热久久最新地址| wwwwwxxxx日本| 免费午夜视频在线观看| 99国产精品白浆在线观看免费| 美女网站免费观看视频| 国产视频一视频二| 日韩精品久久一区二区| 91热视频在线观看| 手机在线免费观看毛片| 黄色片视频在线免费观看| 欧美视频在线第一页| www.偷拍.com| 污视频在线观看免费网站| 国产九九在线视频| 男人的天堂日韩| 熟女人妇 成熟妇女系列视频| www精品久久| 黄色成人在线看| 男人插女人视频在线观看| 午夜不卡福利视频| 日韩av加勒比| 999热精品视频| 偷拍盗摄高潮叫床对白清晰| 在线视频一二区| 亚洲精品偷拍视频| 日本免费在线视频观看| 樱花草www在线| 无码毛片aaa在线| 日韩精品免费一区| 国产在线播放观看| 欧美 日韩精品| www日韩在线观看| 天天干天天玩天天操| 在线免费看污网站| 国产在线拍揄自揄拍无码| 免费网站在线观看视频| 亚洲 高清 成人 动漫| 无码人妻丰满熟妇区毛片18| 91蝌蚪视频在线观看| www.cao超碰| 在线观看17c| 久久国产亚洲精品无码| 婷婷丁香激情网| 性久久久久久久久久久久久久| 三年中国中文在线观看免费播放| 免费极品av一视觉盛宴| 国产女大学生av| 欧美成人乱码一二三四区免费| 亚洲自拍第三页| 无码中文字幕色专区| 少妇一级淫免费放| 日本成人在线不卡| 手机看片福利盒子久久| 国产制服91一区二区三区制服| 99精品在线免费视频| 成人日韩在线视频| 日韩视频免费播放| 国产欧美精品一二三| 欧美 日韩 国产 高清| 黄色永久免费网站| 国产在线播放观看| 午夜精品免费看| 免费无码av片在线观看| 免费久久久久久| 国产男女激情视频| 黄色三级中文字幕| 日韩精品aaa| 在线免费观看av的网站| 日韩欧美精品免费| 国产日产欧美一区二区| 午夜免费福利在线| 国产真实乱子伦| 成人免费观看cn| 黄色三级中文字幕| 特级黄色录像片| 日韩av片免费观看| 97超碰人人爽| 九九九在线观看视频| 福利视频一区二区三区四区| 亚洲成人动漫在线| 天堂av免费看| 手机在线国产视频| 香港日本韩国三级网站| 欧美精品成人网| 女人另类性混交zo| 999精品网站| 别急慢慢来1978如如2| 亚洲人成色77777| 国产黄色特级片| 日韩精品无码一区二区三区免费 | 第一区免费在线观看| 黄色在线视频网| 欧美成年人视频在线观看| 超碰在线人人爱| 午夜免费看视频| 黄色片免费网址| 人妻无码一区二区三区四区| 天堂av在线中文| 可以看毛片的网址| 日日橹狠狠爱欧美超碰| 日韩中文字幕组| 91在线第一页| 大胆欧美熟妇xx| 韩国日本在线视频| 日本不卡一区二区在线观看| 青娱乐精品在线| 男人添女人荫蒂免费视频| 国产最新免费视频| 五月天av在线播放| 成人高清dvd| www日韩视频| 日本一级淫片演员| 日本成年人网址| 亚洲制服中文字幕| 国产一级爱c视频| 精品999在线| 乱熟女高潮一区二区在线| 国产男女在线观看| 青少年xxxxx性开放hg| 国产成人精品视频免费看| 91女神在线观看| 国产综合中文字幕| 99视频在线观看视频| 男人天堂999| 美女在线免费视频| 黑森林精品导航| 亚洲一区二区三区av无码| 老司机午夜性大片| 国产成人精品视频免费看| 国产一区一区三区| 国产小视频精品| 日韩在线综合网| 国产精品12p| jizz18女人| 国产主播在线看| 妞干网在线观看视频| 黄黄视频在线观看| 中文字幕22页| 亚洲欧美自偷自拍另类| 六月丁香婷婷激情| 丰满少妇大力进入| 久久久99精品视频| www.亚洲一区二区| 亚洲精品在线视频播放| 爱情岛论坛亚洲首页入口章节| 国产69精品久久久久999小说| 欧美三级午夜理伦三级老人| 国产又大又黄又猛| 三级在线视频观看| 亚洲一区在线不卡| 色一情一区二区三区| 国产高清视频网站| 亚洲午夜精品一区| www.污网站|