凡事總須研究,才會明白。古來常做登錄,我也還記得,可是不甚清楚。我橫豎睡不著,仔細看了半夜。
begin start login , 先聊下cookie和session
cookie 有個 **http only **告知瀏覽器,Cookies 的內(nèi)容不允許被客戶端的腳本訪問,只用于http,看下圖
Cookie和Session 的關(guān)系
就如大眾所知,HTTP 協(xié)議是無狀態(tài)的 。要想分辨每次http請求是哪個用戶,需要使用Cookie和Session Session 的中文翻譯為:「會話」
Set-Cookie
服務(wù)器管理狀態(tài)使用到的字段,用于響應(yīng)首部一則響應(yīng)首部的 Set-Cookie 字段:(看第一張圖。)
set-Cookie: status=enable;expires= Tue, 05 Jul 2018 07:26:31 GMT;path=/;domain=.xxxx;HttpOnly
普通的登錄
普通的登錄,要的就是一個登錄頁面,輸入賬號密碼,提交Form表單,后端查詢數(shù)據(jù)庫對應(yīng)用戶名的密碼,匹配正確則把用戶記錄到Session,不正確則返回錯誤。
但可能他沒有教你的是,密碼需要hash加密 。下圖的網(wǎng)站沒加
密碼Hash密碼hash,就是存進數(shù)據(jù)庫的密碼是一串密文,密文是明文密碼通過不可逆算法得出的。在Nodejs中,你可以使用bcryptjs,它提供了hash
以及對應(yīng)的compare
方法,非常適合用于密碼的加密和對比。
有bcrypt項目使用地址
單點登錄的2種方式
單點登錄說白了就是在站點A的登錄了,那么用戶就自動在站點B、站點C、站點E登錄了。這里說的是2個跨域的域名,基礎(chǔ)域名不需要單點登錄技術(shù),直接通過path , domain 可以解決
1.JSONP的實現(xiàn)方式
用戶在父應(yīng)用中登錄后,Cookie會存到客戶端中,當(dāng)用戶需要登錄子應(yīng)用的時候,授權(quán)應(yīng)用訪問父應(yīng)用提供的JSONP接口,并在請求中帶上父應(yīng)用域名下的Cookie。
這種做法是cookie 的安全性問題。安全問題放在了前端
2.302 重定向的方式
父應(yīng)用提供一個GET方式的登錄接口,用戶通過子應(yīng)用302重定向連接的方式訪問這個接口,如果用戶還沒有登錄,則返回一個的登錄頁面,用戶輸入賬號密碼進行登錄。如果用戶已經(jīng)登錄了,則告知子應(yīng)用登錄當(dāng)前用戶的狀態(tài)。并返回相應(yīng)信息
普通的cookie 識別,只適合不跨域的情況!
最簡單的是使用cookie作為媒介,存放用戶憑證。用戶登錄父應(yīng)用之后,應(yīng)用返回一個cookie,當(dāng)用戶訪問子應(yīng)用的時候,攜帶上這個cookie,校驗通過則登錄當(dāng)前用戶。