原文地址html
本文主要列舉在現在先後端分離、手機App大行其道的現狀下,用戶認證、受權的幾種作法及對比。git
PS. 本文假設你已經理解了各類認證模式的具體細節。github
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 |
名詞定義:後端
Client owner:瀏覽器
User context:服務器
Client type:app
App type:前後端分離
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所使用的技術,用戶輸入帳號和密碼登陸系統,服務端返回一個名字叫作SESSIONID
的Cookie
,以後User-agent和服務端每次交互都會攜帶這個Cookie
,經過這種方式來作到用戶登陸狀態的保持。
SSO模式: 實際上是Session模式的變種,只不過把認證從Session模式的本地認證變成了利用SSO服務器作認證。已知SSO類型有:CAS、SAML。
JWT模式: 它和Session模式的區別在於:
Cookie
攜帶,而是放在Header
裏,這個信息咱們叫作Token
。Token
裏包含了加密的、不可篡改的當前登陸用戶的信息,SESSIONID
只是一個代號,是沒有這個信息的。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。