也不知道是什么原因,剛開始不久的職業(yè)生涯,在技術這條路走著走著,和「登錄」總是有著一個不解之緣。還記得當初學習Web編程的時候么?不管是Java、.Net、PHP,繼經典「Hello World」之后,要寫的很有可能就是「登錄」功能。至今「登錄」的問題還是讓我心中一萬只草泥馬奔過。
下面,給分享一下各種「登錄」相關的需求
普通的登錄
這個是極其普通的登錄需求,要的就是一個登錄頁面,輸入賬號密碼,提交Form表單,后端查詢數據庫對應用戶名的密碼,匹配正確則把用戶記錄到Session,不正確則返回錯誤。
這種登錄,在上學的時候,也許敬愛的老師就已經教過你了。
但可能他沒有教你的是,密碼需要hash加密,session為什么可以記錄登錄用戶的原理。
密碼Hash
密碼hash,就是存進數據庫的密碼是一串密文,密文是明文密碼通過不可逆算法得出的。在Nodejs中,你可以使用bcryptjs,它提供了hash以及對應的compare方法,非常適合用于密碼的加密和對比。
Session原理
Session的原理其實還是依賴了Cookie,所以Cookie才是記錄用戶憑證的真理。它的原理大概是醬紫的:服務器端維護一個session的表,這個表的每一條記錄存的就是與某一個客戶端的會話,會話會有過期時間,過期的會話會被清理。然后這個會話,會有一個對應的id,一般是一串長長的看不懂的字符串,然后這個字符串會被存儲在客戶端的cookie中,每一次請求服務器端都會帶上這個cookie,服務器端就知道訪問的就是哪個客戶端了。
欲知更多有關「Session原理」請點擊傳送門:Session原理
使用獨立登錄系統
應項目需要,登錄邏輯需要獨立出來做成一個系統,就是另外一個項目。與原來的主站不是在同一個項目中了。一個域名是 www.site.com,一個則是passport.site.com了。要在不同的域名下進行登錄,一般的方法是www.site.com/login 跳轉到 passport.site.com/login,passport這邊是一個登錄頁面,用戶輸入賬號密碼登錄成功之后,passport會通過帶著一個可逆加密的包含用戶信息的token,重定向到www.site.com提供的回調處理地址,然后進行解密,匹配正確,則登錄用戶。
要注意的是,這里的加密的信息需要包含一個時間戳,接收方需要認證這個時間戳,過期登錄失敗。避免token被竊取,被無限登錄site系統。
單點登錄
單點登錄需要實現的需求,說白了就是在站點A的登錄了,那么用戶就自動在站點B、站點C、站點E、F、G登錄。
這又分兩種情況,A站點和B站點是否在同一個二級域名下。
假如是在同一個域名下,例如siteA.site.com與siteB.site.com,因為cookie允許設置到二級域名下.site.com,所以siteA和siteB是可以共享cookie的,用戶的信息可以通過可逆加密放在二級域名下的cookie,并且設置http only,就可以一站登錄,站站登錄。
而如果A站點和B站點不在同一二級域名下,例如www.siteA.com與www.siteB.com,他們就無法通過共享cookie的方式共享用戶信息,所以需要用到jsonp的方式,用戶在siteA登錄之后,提供一個jsonp接口獲取加密的用戶信息,siteB訪問這個jsonp獲取加密信息。達到共享用戶狀態(tài)的效果。
欲知更多有關「單點登錄」請點擊傳送門:單點登錄的三種實現方式
OAuth2.0登錄
這就比較普遍了,現在隨隨便便做個網站,都接入「微信登錄」、「微博登錄」、「豆瓣登錄」、「QQ登錄」、「Github登錄」、@^&@%#%@%&%@&#........
這些統一叫做:「第三方登錄」。
第三方登錄都是實現了OAuth2.0協議的,流程大概是醬紫的:
第三方提供一個登錄入口,也就是第三方域名下的登錄頁面。主站需要登錄的時候,引導用戶重定向到第三方的登錄頁面,用戶輸入賬號密碼之后,登錄第三方系統,第三方系統匹配帳號成功之后,帶上一個code到主站的回調地址,主站接收到code,短時間內拿著code請求第三方提供獲取長期憑證的接口(因為code有一個比較短的過期時間),這個長期憑證叫access_token,獲取之后就把這個access_token存到數據庫中,請求一些第三方提供的API,需要用到這個access_token,因為這個token就是記錄用戶在第三方系統的一個身份憑證。
一些系統,在獲取access_token的時候,還會返回一個副參數refresh_token,因為access_token是有過期時間的,一旦過期了,主站可以使用refresh_token請求第三方提供的接口獲取新的access_token以及新的refresh_token。
在Nodejs中,你可以使用passport來給第三方登錄提供一個統一解決方案,而如果你是開發(fā)「微信公眾號」授權,除了passport,也可以使用wechat-oauth
在最后
其實登錄問題,理解了Session原理是很重要的,這個也不難理解。然后站點之間的用戶信息交流,就是通過各種跨域限制,各種加密解密而已。在做這個的時候,需要充分考慮到加密的token是否會被竊取的可能性,還要考慮讓這個token加上時間的驗證,在一些可能會被竊取,安全需求比較高的情況,就需要把token的時間設置的更短。還有就是加密的方式需要依照需求不同而選擇可逆或者不可逆,hash sha1還是JWT(Json Web Token)。
sha1加密,可以使用Nodejs自帶的crypto,JWT可以使用jsonwebtoken
如果本文對您有用
請不要吝嗇你們的Follow與Start
這會大大支持我們繼續(xù)創(chuàng)作
「Github」
MZMonster :@MZMonster
JC_Huang :@JerryC8080