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

站長資訊網
最全最豐富的資訊網站

什么是單點登錄系統?用nodejs怎么實現?

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

什么是單點登錄系統?用nodejs怎么實現?

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

一. 基礎知識

1.1 同源策略

源 = 協議 + 域名 +端口

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

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

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

1.2 會話機制

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

常用的會話跟蹤就是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'   }})
登錄后復制

什么是單點登錄系統?用nodejs怎么實現?

2. 跨域SSO

當我們的域名為www.a.com,www.b.com時,無論怎樣設置domain都沒用了。

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

2.1 跨域寫cookie
2.1.1 利用< script />標簽跨域寫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>
登錄后復制

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

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

或者使用jquery jsonp的方式發起跨域請求,寫入cookie,這種方式的原理也是通過< script />標簽能夠跨域實現的。

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

這樣通過< script />標簽就實現了往www.a.com中寫入了domain為www.c.com的跨域cookie.
什么是單點登錄系統?用nodejs怎么實現?
后端

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就行了.
    什么是單點登錄系統?用nodejs怎么實現?

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

  • 瀏覽器未寫入cookie報錯server 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請求,適用于所有瀏覽器,但是缺點也很明顯,每次只能分享給一個服務器。
什么是單點登錄系統?用nodejs怎么實現?

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

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

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

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

www.c.com

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

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

3. nodejs實現單點登錄系統實戰

什么是單點登錄系統?用nodejs怎么實現?
效果如圖所示:

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

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

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

  • 訪問www.b.com首頁,無需登錄直接跳轉

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

詳細設計:
什么是單點登錄系統?用nodejs怎么實現?

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
992tv成人免费观看| 日韩欧美一级在线| 国产av第一区| 男人j进女人j| 欧美一级片免费播放| 国产精品50p| 欧美成人免费高清视频| 婷婷激情5月天| 中国丰满人妻videoshd| 一级特黄妇女高潮| 五月天激情播播| 老熟妇仑乱视频一区二区| 精品视频在线观看一区| 色网站在线视频| 国产精品嫩草影视| 久久国产精品国产精品| 亚洲一区二区三区四区五区xx| 91精品国产三级| 黄色一级片在线看| 国内外免费激情视频| 国产淫片免费看| 国产精品12p| 黄色www网站| 凹凸日日摸日日碰夜夜爽1| 九一国产精品视频| wwwwww欧美| 九九九九免费视频| 最近中文字幕免费mv| 北条麻妃av高潮尖叫在线观看| 日本韩国欧美在线观看| 国产又粗又硬又长| 精品无码av无码免费专区| 日韩中文字幕在线视频观看| 霍思燕三级露全乳照| 91社在线播放| 大桥未久一区二区三区| wwwxxx黄色片| av在线无限看| 亚洲 欧美 另类人妖| 一级黄色在线播放| 青春草国产视频| 欧美日韩黄色一级片| 国产精品免费看久久久无码| 黄色一级片在线看| 18禁免费观看网站| 国产日韩一区二区在线| 北条麻妃av高潮尖叫在线观看| 国产精品波多野结衣| 色中文字幕在线观看| 亚洲色图欧美自拍| 久久最新免费视频| 法国空姐在线观看免费| 一本二本三本亚洲码 | 国产成人一区二区三区别| 在线观看免费视频高清游戏推荐| 成人综合视频在线| 看看黄色一级片| 日本成人在线不卡| 香蕉视频xxxx| 五月婷婷狠狠操| 午夜国产福利在线观看| 三上悠亚免费在线观看| 日本熟妇人妻xxxxx| 青青青免费在线| 久久久久免费看黄a片app| 久久观看最新视频| 欧美中日韩在线| mm1313亚洲国产精品无码试看| 一区二区三区四区毛片| 春日野结衣av| 国产www免费| 国产黄页在线观看| 冲田杏梨av在线| 老太脱裤子让老头玩xxxxx| 午夜免费福利视频在线观看| 欧美日韩在线一| 久艹视频在线免费观看| 日韩a级黄色片| 久久久久久久久久久久久国产精品| 成人午夜免费在线| 免费黄色特级片| 国产a级一级片| 欧美一级黄色录像片| 精产国品一二三区| www.99r| 国产免费观看高清视频| 伊人精品视频在线观看| 欧美日韩一区二区三区电影| 欧美激情第3页| 午夜久久福利视频| 毛葺葺老太做受视频| 国产亚洲黄色片| 欧美色图另类小说| av污在线观看| 激情五月五月婷婷| 国产精品www在线观看| 久久成年人网站| 九九九九九九九九| 亚洲美女性囗交| 亚洲欧美日韩一二三区| 欧美高清中文字幕| 一级黄色片在线免费观看| 男人草女人视频| 韩国一区二区在线播放| 日韩欧美国产免费| 日本高清xxxx| 国产玉足脚交久久欧美| 丰满人妻一区二区三区53号| 欧美精品 - 色网| 91pony九色| 亚洲一级片免费| 国产美女在线一区| 国产日韩一区二区在线| 国产极品尤物在线| 久久久久久久激情| 加勒比成人在线| av五月天在线| 超级碰在线观看| 欧美 日本 亚洲| 奇米影视四色在线| 天天久久综合网| www.xxx亚洲| 国产女同无遮挡互慰高潮91| 一本之道在线视频| 中文字幕第三区| 天堂av手机在线| 一级淫片在线观看| 一级黄色在线播放| www.成年人| 亚洲制服中文字幕| 国产成人在线综合| 国产高清www| 亚欧无线一线二线三线区别| 18视频在线观看娇喘| 欧美丰满熟妇xxxxx| 亚洲国产精品无码观看久久| a级黄色片网站| 成人免费在线观看视频网站| 97公开免费视频| 免费观看黄色的网站| 伊人再见免费在线观看高清版| 在线观看国产福利| www.涩涩涩| 少妇久久久久久被弄到高潮| 亚洲五月激情网| 真人做人试看60分钟免费| 欧美这里只有精品| 亚洲视频在线观看一区二区三区| 亚洲第一页在线视频| 熟女少妇在线视频播放| 丝袜老师办公室里做好紧好爽| 黑人粗进入欧美aaaaa| 男女猛烈激情xx00免费视频| 邪恶网站在线观看| 色一情一区二区| 欧美aⅴ在线观看| 污污的视频免费观看| 亚洲欧美天堂在线| 99999精品视频| 欧美日韩亚洲第一| 日本精品久久久久久久久久| 男人的天堂最新网址| 九九视频精品在线观看| 国产乱子伦精品视频| 糖心vlog在线免费观看| 日韩av一二三四区| 国产福利在线免费| 国产自产在线视频| 一级特黄性色生活片| 被灌满精子的波多野结衣| 污污网站免费看| 日韩在线一级片| av丝袜天堂网| 久久av秘一区二区三区| 在线观看av网页| 中文字幕亚洲乱码| 天天操天天爽天天射| 欧美国产综合在线| 99在线免费视频观看| 另类小说第一页| 91n.com在线观看| 国产大尺度在线观看| 日日橹狠狠爱欧美超碰| 超碰在线资源站| 亚洲中文字幕无码av永久| 亚洲成熟丰满熟妇高潮xxxxx| 97人人模人人爽人人澡| 91九色在线观看视频| 裸体裸乳免费看| 91 视频免费观看| 99久久国产综合精品五月天喷水| 日韩欧美国产综合在线| 欧美亚洲黄色片| www.欧美激情.com| 国产又猛又黄的视频| 国产一级片自拍| 美女在线免费视频| 国产深夜男女无套内射| 亚洲综合婷婷久久| 日日噜噜夜夜狠狠久久丁香五月|