多種認證、受權模型的比較

原文地址html

本文主要列舉在現在先後端分離、手機App大行其道的現狀下,用戶認證、受權的幾種作法及對比。git

PS. 本文假設你已經理解了各類認證模式的具體細節。github

OAuth2.0的幾種模式

OAuth2.0是一個被普遍採用的事實標準,它同時包含認證和受權兩種模式,咱們來看一下它有幾種模式:web

Grant type Client owner User context? Client type App type
Authorization Code Third-party Y confidential Web app
Authorization Code, without client secret Third-party Y public User-agent app
Authorization Code, without client secret, with PKCE Third-party Y public Native app
OAuth2 Implicit(deprecated) Third-party Y public User-agent app, Native app
Password First-party Y both Web app, User-agent app, Native app
Client Credentials Third-party N confidential Web app

名詞定義:後端

  • User: 天然人。
  • Client: 索要Authorization Code和Access Token的程序。

Client owner:瀏覽器

  • First-party: 第一方client,即client開發者/廠商和Resource Server是同一我的/廠商。
  • Third-party: 第三方client,即client開發者/廠商和Resource Server不是同一我的/廠商。OAuth 2.0主要解決的是第三方client的受權問題。

User context:服務器

  • Y: 表明被受權的資源是和當前User相關的。
  • N: 表明被受權的資源是和Client相關的。

Client type:app

  • Confidential: 這類Client和Authorization Server/Resource Server的通訊是祕密進行的。
  • Public: 這類Client和Authorization Server/Resource Server的通訊是公開進行的。

App type:前後端分離

  • web app: 這類App的代碼在服務器上執行,用戶經過User-Agent(瀏覽器)下載App渲染的HTML頁面,並與之交互。好比,傳統的MVC應用。
  • user-agent app: 這類App的代碼是直接下載到User-Agent(瀏覽器)裏執行的。好比,先後端分離App、SPA。
  • native app: 這類App安裝在用戶的設備上,能夠認爲這類App內部存儲的credential信息是有可能被提取的。好比,手機App、桌面App。

僅作認證的模式

Mode Client belong User Context App type
Session First-party Y Web app
SSO First-party Y Web app
JWT First-party Y Web app, User-agent app, Native app

詳細說明以上三種模式:ide

Session模式: 就是咱們傳統的Web app所使用的技術,用戶輸入帳號和密碼登陸系統,服務端返回一個名字叫作SESSIONIDCookie,以後User-agent和服務端每次交互都會攜帶這個Cookie,經過這種方式來作到用戶登陸狀態的保持。

SSO模式: 實際上是Session模式的變種,只不過把認證從Session模式的本地認證變成了利用SSO服務器作認證。已知SSO類型有:CAS、SAML。

JWT模式: 它和Session模式的區別在於:

  1. 用戶會話信息不經過Cookie攜帶,而是放在Header裏,這個信息咱們叫作Token
  2. Token裏包含了加密的、不可篡改的當前登陸用戶的信息,SESSIONID只是一個代號,是沒有這個信息的。
  3. 服務端能夠作到無狀態,由於用戶信息在Token裏已經存在,不再須要維護Session了。

JWT模式可使用SSO嗎?答案是能夠的,可是有條件,在SSO認證流程的最後一步——獲取用戶信息——的通訊必須是confidential的。

對於Web app來講只要它接入了SSO,獲取用戶信息的通訊原本就是confidential的,它得到用戶信息以後構造JWT並返回就能夠了。

對於User-agent app和Native app來講,須要爲它作一箇中介Web app,這個Web app和SSO通訊,而後構造JWT返回給User-agent app。

參考資料

相關文章
相關標籤/搜索