1. 程式人生 > 實用技巧 >單點登入,實現登入狀態保持

單點登入,實現登入狀態保持

單點登入

SSO,也就是單點登入bai(single sign-on),它是一種認證方法,要求使用者只登入一次
使用一個使用者ID和密碼,登入多個應用、系統或Web網站。而Open Group對單點登入的定義是“單點登入(SSO)是使用者認證和授權的單一行為可以允許一位使用者訪問他的訪問許可中包含的所有電腦和系統,而不要輸入多個密碼的機制。單點登入減少了人為錯誤,
這是系統失敗的重要因素,需求量很大,但很難實施。”
企業的單點登入(SSO)為終端使用者提供了改善使用者經驗,幫助IT員工減少管理大量應用上的密碼的成本。

方法一:cookie和session配合使用

首先,使用者登入輸入使用者名稱和密碼,瀏覽器傳送post

請求,伺服器後臺獲取使用者資訊,查詢資料庫驗證使用者資訊是否正確。如果驗證通過,就會建立session來儲存相關資訊,並且生成一個cookie字串,把sessionID放在cookie裡面。然後返回給瀏覽器。
當用戶下一次發起請求時,瀏覽器會自動攜帶cookie去請求伺服器,伺服器識別後,通過裡面的sessionID,就可以直接讀取session中的使用者資訊。這樣,使用者就可以直接訪問,不需要再輸入使用者名稱和密碼來驗證身份。

缺點:

  • cookie容易被修改,被劫持,並不是絕對的安全
  • 大型專案中,伺服器往往不止一臺
    如果第一次請求,使用者資訊被儲存在伺服器1的session空間裡。而第二次請求被分流到了伺服器2,這樣就獲取不到使用者資訊,依然要重新登入。

方法二:如果cookie被禁用了,怎麼保持登入狀態?

保持登入的關鍵不是cookie,而是通過 cookie儲存和傳輸的 sessionID,其本質是能獲取使用者資訊的資料。除了 cookie,還通常使用 HTTP請求頭來傳輸,比如標準的Authorization,也可以自定義,如 X-Auth-SessionID 等。但是這個請求頭瀏覽器不會像 cookie 一樣自動攜帶,需要手工處理。也可以進行url地址重寫,將sessionID追加在url後面

注意:
前面的cookiesession這種模式,沒有分散式架構,無法支援橫向擴充套件。如果使用一個伺服器,該模式完全沒有問題。但是,如果它是伺服器群集或面向服務的跨域體系結構的話,則需要一個統一的session

資料庫來儲存會話資料實現共享,這樣負載均衡下的每個伺服器才可以正確的驗證使用者身份。

方法三:JWT(JSON Web Token)

什麼是JWT?
JSON Web Token(JWT)是一個開放式標準(RFC 7519),它定義了一種緊湊且自包含的方式,用於在各方之間以JSON物件安全傳輸資訊。這些資訊可以通過數字簽名進行驗證和信任。可以使用祕鑰(使用HMAC演算法)或使用RSA的公鑰/私鑰對對JWT進行簽名。

為什麼使用JWT?
隨著技術的發展,分散式web應用的普及,通過session管理使用者登入狀態成本越來越高,因此慢慢發展成為token的方式做登入身份校驗,然後通過token去取redis中的快取的使用者資訊。隨著之後JWT的出現,校驗方式更加簡單便捷化,無需通過redis快取,而是直接根據token取出儲存的使用者資訊,以及對token可用性校驗,單點登入更為簡單。

JWT的優點:

  • 體積小,因而傳輸速度更快
  • 多樣化的傳輸方式,可以通過URL傳輸、POST傳輸、請求頭Header傳輸(常用)
  • 簡單方便,服務端拿到jwt後無需再次查詢資料庫校驗token可用性,也無需進行redis快取校驗
  • 在分散式系統中,很好地解決了單點登入問題
  • 很方便的解決了跨域授權問題,因為跨域無法共享cookie

JWT的缺點:

  • 因為JWT是無狀態的,因此服務端無法控制已經生成的Token失效,這是不可控的
  • 獲取到JWT也就擁有了登入許可權,因此JWT是不可洩露的,網站最好使用https,防止中間攻擊偷取JWT

實現方式:

  • JWT的原則是在伺服器身份驗證之後,將生成一個JSON物件並將其傳送回用戶;
  • 之後,當用戶與伺服器通訊時,客戶端在請求中發回JSON物件。伺服器僅依賴於這個JSON物件來標識使用者。為了防止使用者篡改資料,伺服器將在生成物件時添加簽名
  • 伺服器不儲存任何會話資料,即伺服器變為無狀態,使其更容易擴充套件。