Spring-security-oAuth2分享
oAuth2簡介
OAuth 2.0是用於授權的行業標准協議。OAuth 2.0致力於簡化客戶端開發人員的工作,同時為Web應用程序,桌面應用程序,移動電話和客廳設備提供特定的授權流程。該規范及其擴展正在IETF OAuth工作組內開發。
代碼地址
https://github.com/guo-yong123/spring-cloud-security-oauth2.git
oAuth2主要包含有以下主要角色
-
資源所有者
-
客戶端 包括 client_id和client_secret
-
認證服務器(Authorization server): 即服務提供商專門用來處理認證的服務器,簡單點說就是登錄功能(驗證用戶的賬號密碼是否正確以及分配相應的權限)
-
資源服務器(Resource server): 即服務提供商存放用戶生成的資源的服務器。它與認證服務器,可以是同一台服務器,也可以是不同的服務器。簡單點說就是資源的訪問入口,比如上節中提到的“雲筆記服務”和“雲相冊服務”都可以稱之為資源服務器。
-
交互流程
oAuth2四種授權類型,主要說下授權碼模式和密碼模式
-
授權碼模式
-
授權碼是一個臨時性的憑證,用來換取access_token和refresh_token
code只能使用一次,用完作廢。
-
這個 code 的作用是保護 token 的安全性。如果直接把 token 返回給應用,很容易被攔截、竊聽。引入了 code 之后,即使攻擊者能夠竊取到 code,但是由於他無法獲得應用保存在服務器的
client_secret
,因此也無法通過 code 換取 token。使用code換取token為什么不容易被攔截、竊聽呢?這是因為,首先,這是一個從服務器到服務器的訪問,黑客比較難捕捉到;其次,這個請求通常要求是 https 的實現。即使能竊聽到數據包也無法解析出內容。有了這個 code,token 的安全性大大提高。因此,oAuth2.0 鼓勵使用這種方式進行授權,而簡單模式則是在不得已情況下才會使用。
-
獲取授權碼 http://localhost:9090/oauth/authorize?client_id=client&response_type=code
-
獲取token http://localhost:8080/oauth/token?grant_type=authorization_code&code=
-
-
密碼模式
-
密碼模式中,用戶向客戶端提供自己的用戶名和密碼。客戶端使用這些信息,向 "服務商提供商" 索要授權。在這種模式中,用戶必須把自己的密碼給客戶端,但是客戶端不得儲存密碼。這通常用在用戶對客戶端高度信任的情況下,比如客戶端是操作系統的一部分。
一個典型的例子是同一個企業內部的不同產品要使用本企業的 oAuth2.0 體系。
獲取token http://localhost:9090/oauth/token?username=user&password=123456&grant_type=password&scope=select&client_id=client_2&client_secret=123456
-
-
oauth2提供的默認端點
-
/oauth/authorize:授權端點 /oauth/token:令牌端點 /oauth/confirm_access:用戶確認授權提交端點 /oauth/error:授權服務錯誤信息端點 /oauth/check_token:用於資源服務訪問的令牌解析端點 /oauth/token_key:提供公有密匙的端點,如果使用JWT令牌的話
-