OAuth2是一個授權(quán)(Authorization)協(xié)議,。我們要和Spring Security的認(rèn)證(Authentication)區(qū)別開來,,認(rèn)證(Authentication)證明的你是不是這個人,而授權(quán)(Authorization)則是證明這個人有沒有訪問這個資源(Resource)的權(quán)限,。 +--------+ +---------------+ | |--(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:客戶端應(yīng)用程序(Application) Authorization Server:授權(quán)服務(wù)器 Resource Server:資源服務(wù)器
再來解釋一下上圖的大致流程: (A) 用戶連接客戶端應(yīng)用程序以后,,客戶端應(yīng)用程序要求用戶給予授權(quán) (B) 用戶同意給予客戶端應(yīng)用程序授權(quán) (C) 客戶端應(yīng)用程序使用上一步獲得的授權(quán)(Grant),向授權(quán)服務(wù)器申請令牌 (D) 授權(quán)服務(wù)器對客戶端應(yīng)用程序的授權(quán)(Grant)進(jìn)行驗證后,,確認(rèn)無誤,,發(fā)放令牌 (E) 客戶端應(yīng)用程序使用令牌,向資源服務(wù)器申請獲取資源 (F) 資源服務(wù)器確認(rèn)令牌無誤,,同意向客戶端應(yīng)用程序開放資源
從上面的流程可以看出,,如何獲取授權(quán)(Grant)才是關(guān)鍵。在OAuth2中有4種授權(quán)類型: 1. Authorization Code(授權(quán)碼模式):功能最完整,、流程最嚴(yán)密的授權(quán)模式,。通過第三方應(yīng)用程序服務(wù)器與認(rèn)證服務(wù)器進(jìn)行互動。廣泛用于各種第三方認(rèn)證,。 2. Implicit(簡化模式):不通過第三方應(yīng)用程序服務(wù)器,,直接在瀏覽器中向認(rèn)證服務(wù)器申請令牌,更加適用于移動端的App及沒有服務(wù)器端的第三方單頁面應(yīng)用,。 3. Resource Owner Password(密碼模式):用戶向客戶端服務(wù)器提供自己的用戶名和密碼,,用戶對客戶端高度信任的情況下使用,比如公司,、組織的內(nèi)部系統(tǒng),,SSO。 4. Client Credentials(客戶端模式):客戶端服務(wù)器以自己的名義,,而不是以用戶的名義,,向認(rèn)證服務(wù)器進(jìn)行認(rèn)證。 下面主要講最常用的(1)和(3),。此外,,還有一個模式叫Refresh Token,,也會在下面介紹,。
Authorization Code(授權(quán)碼模式) +----------+ | 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),客戶端索要授權(quán),,并將用戶導(dǎo)向認(rèn)證服務(wù)器(Authorization Server),。 (B) 用戶選擇是否給予客戶端授權(quán)。 (C) 假設(shè)用戶給予授權(quán),認(rèn)證服務(wù)器將用戶導(dǎo)向客戶端事先指定的"重定向URI"(redirection URI),,同時附上一個授權(quán)碼,。 (D) 客戶端收到授權(quán)碼,附上早先的"重定向URI",,向認(rèn)證服務(wù)器申請令牌,。這一步是在客戶端的后臺的服務(wù)器上完成的,對用戶不可見,。 (E) 認(rèn)證服務(wù)器核對了授權(quán)碼和重定向URI,確認(rèn)無誤后,向客戶端發(fā)送訪問令牌(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) 客戶端將用戶名和密碼發(fā)給認(rèn)證服務(wù)器(Authorization Server),,向后者請求令牌,。 (C) 認(rèn)證服務(wù)器確認(rèn)無誤后,向客戶端提供訪問令牌,。
令牌刷新(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 +---------------+ 具體流程不再分析,,我們已知,當(dāng)我們申請token后,,Authorization Server不僅給了我們Access Token,,還有Refresh Token。當(dāng)Access Token過期后,,我們用Refresh Token訪問/refresh端點就可以拿到新的Access Token了,。
本節(jié)只講概念,在接下來的幾節(jié)中會搭建一組含有Client Application, Authorization Server, Resource Server的微服務(wù)群,,并使用Eureka和Config組件管理,。 |
|