client:呼叫資源伺服器api的應用
oauth 2.0 provider:包括authorization server和resource server
(1)authorization server:認證伺服器,進行認證和授權
(2)resource server:資源伺服器,保護受保護的資源
user:資源的擁有者
(1)authorizationendpoint:進行授權的服務,default url:/oauth/authorize
(2)tokenendpoint:獲取token的服務,default url:/oauth/token
oauth2authenticationprocessingfilter:給帶有訪問令牌的請求載入認證
一般情況下,建立兩個配置類,乙個繼承authorizationserverconfigureradapter,乙個繼承websecurityconfigureradapter,再去複寫裡面的方法。
1、@enableauthorizationserver:宣告乙個認證伺服器,當用此註解後,應用啟動後將自動生成幾個endpoint:(注:其實實現乙個認證伺服器就是這麼簡單,加乙個註解就搞定,當然真正用到生產環境還是要進行一些配置和複寫工作的。)
/oauth/authorize:驗證
/oauth/token:獲取token
/oauth/confirm_access:使用者授權
/oauth/error:認證失敗
/oauth/check_token:資源伺服器用來校驗token
/oauth/token_key:如果jwt模式則可以用此來從認證伺服器獲取公鑰
以上這些endpoint都在原始碼裡的endpoint包裡面。
2、@beans:需要實現authorizationserverconfigurer
authorizationserverconfigurer包含三種配置:
clientdetailsserviceconfigurer:client客戶端的資訊配置,client資訊包括:clientid、secret、scope、authorizedgranttypes、authorities
(1)scope:表示許可權範圍,可選項,使用者授權頁面時進行選擇
(2)authorizedgranttypes:有四種授權方式
(3)authorities:授予client的許可權
這裡的具體實現有多種,in-memory、jdbcclientdetailsservice、jwt等。
authorizationserversecurityconfigurer:宣告安全約束,哪些允許訪問,哪些不允許訪問
authorizationserverendpointsconfigurer:宣告授權和token的端點以及token的服務的一些配置資訊,比如採用什麼儲存方式、token的有效期等
client的資訊的讀取:在clientdetailsserviceconfigurer類裡面進行配置,可以有in-memory、jdbc等多種讀取方式。
jdbc需要呼叫jdbcclientdetailsservice類,此類需要傳入相應的datasource.
authorizationservertokenservices介面:宣告必要的關於token的操作
(1)當token建立後,儲存起來,以便之後的接受訪問令牌的資源可以引用它。
(2)訪問令牌用來載入認證
介面的實現也有多種,defaulttokenservices是其預設實現,他使用了預設的inmemorytokenstore,不會持久化token;
(1)inmemorytokenstore:存放記憶體中,不會持久化
(2)jdbctokenstore:存放資料庫中
(3)jwt: json web token
(1)authenticationmanager:直接注入乙個authenticationmanager,自動開啟密碼授權型別
(2)userdetailsservice:如果注入userdetailsservice,那麼將會啟動重新整理token授權型別,會判斷使用者是否還是存活的
(3)authorizationcodeservices:authorizationcodeservices的例項,auth code 授權型別的服務
(4)implicitgrantservice:imlpicit grant
(5)tokengranter:
(2)websecurityconfigurer的例項,可以配置哪些路徑不需要保護,哪些需要保護。預設全都保護。
(1)有時候,我們可能需要自定義的登入頁面和認證頁面。登陸頁面的話,只需要建立乙個login為字首名的網頁即可,在**裡,設定為允許訪問,這樣,系統會自動執行你的登陸頁。此登陸頁的action要注意一下,必須是跳轉到認證的位址。
(2)另外乙個是授權頁,讓你勾選選項的頁面。此頁面可以參考原始碼裡的實現,自己生成乙個controller的類,再建立乙個對應的web頁面即可實現自定義的功能。
(1)埠號換成你自己的認證伺服器的埠號,client_id也換成你自己的,response_type型別為code。
localhost:8080/uaa/oauth/authorize?client_id=client&response_type=code&redirect_uri=
(2)這時候你將獲得乙個code值:/?code=g0c20z
(3)使用此code值來獲取最終的token:
返回值:
(4)用此token值來呼叫資源伺服器內容(如果資源伺服器和認證伺服器在同乙個應用中,那麼資源伺服器會自己解析token值,如果不在,那麼你要自己去做處理)
curl -h "authorization: bearer b251b453-cc08-4520-9dd0-9aedf58e6ca3" "localhost:8081/service2(此處換上你自己的url)"
在配置類上加上註解@enableresourceserver即啟動。使用resourceserverconfigurer進行配置:
(1)tokenservices:resourceservertokenservices的例項,宣告了token的服務
(2)resourceid:資源id,由auth server驗證。
(3)其它一些擴充套件點,比如可以從請求中提取token的tokenextractor
(4)一些自定義的資源保護配置,通過httpsecurity來設定
使用token的方式也有兩種:
(1)bearer token(https傳輸方式保證傳輸過程的安全):主流
如何訪問資源伺服器中的api?
如果資源伺服器和授權伺服器在同乙個應用程式中,並且您使用defaulttokenservices,那麼您不必太考慮這一點,因為它實現所有必要的介面,因此它是自動一致的。如果您的資源伺服器是乙個單獨的應用程式,那麼您必須確保您匹配授權伺服器的功能,並提供知道如何正確解碼令牌的resourceservertokenservices。與授權伺服器一樣,您可以經常使用defaulttokenservices,並且選項大多通過tokenstore(後端儲存或本地編碼)表示。
(1)在校驗request中的token時,使用remotetokenservices去呼叫authserver中的/auth/check_token。
(2)共享資料庫,使用jdbc儲存和校驗token,避免再去訪問authserver。
(3)使用jwt簽名的方式,資源伺服器自己直接進行校驗,不借助任何中間媒介。
在客戶端獲取到token之後,想去呼叫下游服務api時,為了能將token進行傳遞,可以使用resttemplate.然後使用resttemplate進行呼叫api。
注:scopes和authorities的區別:
scopes是client許可權,至少授予乙個scope的許可權,否則報錯。
authorities是使用者許可權。
SSO單點登入之OAuth2 0登入認證
一 oauth中的角色 client 呼叫資源伺服器api的應用 oauth 2.0 provider 包括authorization server和resource server 1 authorization server 認證伺服器,進行認證和授權 2 resource server 資源伺服...
CAS單點登入 開啟OAuth2 0協議(七)
dependency groupid org.apereo.cas groupid artifactid cas server support oauth webflow artifactid version version dependency cas service cas.server.nam...
架構 SSO 與 OAuth2 0 的區別
是open authority 的縮寫,是令牌代替使用者密碼訪問應用的又一標準,前面一期介紹過 sso單點登入 springboot模擬單點登入 也是令牌登陸的一種方式。最典型的授權碼認證方式 和clientid 的校驗校驗通過後要對 token 訪問許可權做好限制 接受第三方應用的申請,維護 cl...