OAuth2是一個受權(Authorization)協議。咱們要和Spring Security的認證(Authentication)區別開來,認證(Authentication)證實的你是否是這我的,而受權(Authorization)則是證實這我的有沒有訪問這個資源(Resource)的權限。
下面這張圖來源於OAuth 2.0 authorization framework RFC Document,是OAuth2的一個抽象流程。html
+--------+ +---------------+ | |--(A)- Authorization Request ->| Resource | | | | Owner | | |<-(B)-- Authorization Grant ---| | | | +---------------+ | | | | +---------------+ | |--(C)-- Authorization Grant -->| Authorization | | Client | | Server | | |<-(D)----- Access Token -------| | | | +---------------+ | | | | +---------------+ | |--(E)----- Access Token ------>| Resource | | | | Server | | |<-(F)--- Protected Resource ---| | +--------+ +---------------+
先來解釋一下上圖的名詞:瀏覽器
Resource Owner:資源全部者,即用戶服務器
Client:客戶端應用程序(Application)微服務
Authorization Server:受權服務器spa
Resource Server:資源服務器代理
再來解釋一下上圖的大體流程:code
(A) 用戶鏈接客戶端應用程序之後,客戶端應用程序要求用戶給予受權htm
(B) 用戶贊成給予客戶端應用程序受權blog
(C) 客戶端應用程序使用上一步得到的受權(Grant),向受權服務器申請令牌token
(D) 受權服務器對客戶端應用程序的受權(Grant)進行驗證後,確認無誤,發放令牌
(E) 客戶端應用程序使用令牌,向資源服務器申請獲取資源
(F) 資源服務器確認令牌無誤,贊成向客戶端應用程序開放資源
從上面的流程能夠看出,如何獲取受權(Grant)纔是關鍵。在OAuth2中有4種受權類型:
1. Authorization Code(受權碼模式):功能最完整、流程最嚴密的受權模式。經過第三方應用程序服務器與認證服務器進行互動。普遍用於各類第三方認證。
2. Implicit(簡化模式):不經過第三方應用程序服務器,直接在瀏覽器中向認證服務器申請令牌,更加適用於移動端的App及沒有服務器端的第三方單頁面應用。
3. Resource Owner Password(密碼模式):用戶向客戶端服務器提供本身的用戶名和密碼,用戶對客戶端高度信任的狀況下使用,好比公司、組織的內部系統,SSO。
4. Client Credentials(客戶端模式):客戶端服務器以本身的名義,而不是以用戶的名義,向認證服務器進行認證。
下面主要講最經常使用的(1)和(3)。此外,還有一個模式叫Refresh Token,也會在下面介紹。
Authorization Code(受權碼模式)
+----------+ | Resource | | Owner | | | +----------+ ^ | (B) +----|-----+ Client Identifier +---------------+ | -+----(A)-- & Redirection URI ---->| | | User- | | Authorization | | Agent -+----(B)-- User authenticates --->| Server | | | | | | -+----(C)-- Authorization Code ---<| | +-|----|---+ +---------------+ | | ^ v (A) (C) | | | | | | ^ v | | +---------+ | | | |>---(D)-- Authorization Code ---------' | | Client | & Redirection URI | | | | | |<---(E)----- Access Token -------------------' +---------+ (w/ Optional Refresh Token) Note: The lines illustrating steps (A), (B), and (C) are broken into two parts as they pass through the user-agent.
它的步驟以下:
(A) 用戶(Resource Owner)經過用戶代理(User-Agent)訪問客戶端(Client),客戶端索要受權,並將用戶導向認證服務器(Authorization Server)。
(B) 用戶選擇是否給予客戶端受權。
(C) 假設用戶給予受權,認證服務器將用戶導向客戶端事先指定的"重定向URI"(redirection URI),同時附上一個受權碼。
(D) 客戶端收到受權碼,附上早先的"重定向URI",向認證服務器申請令牌。這一步是在客戶端的後臺的服務器上完成的,對用戶不可見。
(E) 認證服務器覈對了受權碼和重定向URI,確認無誤後,向客戶端發送訪問令牌(access token)和更新令牌(refresh token)。這一步也對用戶不可見。
Resource Owner Password(密碼模式)
+----------+ | Resource | | Owner | | | +----------+ v | Resource Owner (A) Password Credentials | v +---------+ +---------------+ | |>--(B)---- Resource Owner ------->| | | | Password Credentials | Authorization | | Client | | Server | | |<--(C)---- Access Token ---------<| | | | (w/ Optional Refresh Token) | | +---------+ +---------------+ Figure 5: Resource Owner Password Credentials Flow
它的步驟以下:
(A) 用戶(Resource Owner)向客戶端(Client)提供用戶名和密碼。
(B) 客戶端將用戶名和密碼發給認證服務器(Authorization Server),向後者請求令牌。
(C) 認證服務器確認無誤後,向客戶端提供訪問令牌。
令牌刷新(refresh token)
+--------+ +---------------+ | |--(A)------- Authorization Grant --------->| | | | | | | |<-(B)----------- Access Token -------------| | | | & Refresh Token | | | | | | | | +----------+ | | | |--(C)---- Access Token ---->| | | | | | | | | | | |<-(D)- Protected Resource --| Resource | | Authorization | | Client | | Server | | Server | | |--(E)---- Access Token ---->| | | | | | | | | | | |<-(F)- Invalid Token Error -| | | | | | +----------+ | | | | | | | |--(G)----------- Refresh Token ----------->| | | | | | | |<-(H)----------- Access Token -------------| | +--------+ & Optional Refresh Token +---------------+
具體流程再也不分析,咱們已知,當咱們申請token後,Authorization Server不只給了咱們Access Token,還有Refresh Token。當Access Token過時後,咱們用Refresh Token訪問/refresh端點就能夠拿到新的Access Token了。
本節只講概念,在接下來的幾節中會搭建一組含有Client Application, Authorization Server, Resource Server的微服務羣,並使用Eureka和Config組件管理。