解釋OAuth2技術
正如我所說,咱們將使用OAuth2協議,所以首先要解釋這個協議是如何工做的。
OAuth2有一些變體,但我將解釋我將在程序中使用的內容,爲此,我將給你一個例子,以便你瞭解咱們打算作什麼。
舉個例子,在商店裏用信用卡付款。在這種場景下,有三個角色:商店、銀行和咱們。OAuth2協議中也發生了相似的事情,就像這樣:
1.客戶或買方須要銀行提供信用卡。而後,銀行將收集咱們的信息,覈實咱們是誰,並根據咱們賬戶中的資金向咱們提供信用卡或者直接拒絕咱們。在授予卡的OAuth2協議中,它稱爲身份驗證服務器。
2.若是銀行給了咱們卡,咱們能夠去商店,即網絡服務器,咱們提供信用卡。商店不欠咱們任何東西,但他們能夠經過讀卡器向銀行詢問他們是否能夠信任咱們以及信用餘額(信用餘額)。商店是資源服務器。
3.商店,根據銀行說咱們擁有的錢,將容許咱們購買。在OAuth2類比中,Web服務器將容許咱們訪問頁面,具體取決於咱們的財務情況。
若是您沒有注意到一般使用身份驗證服務器,當您轉到網頁並被要求註冊時,它容許您經過Facebook或Google進行。Facebook或Google成爲發行「卡」的「銀行」,並會驗證您的「信用」是否足夠支付這個商品。
您能夠看到「El Pais」的網站並建立一個賬戶。若是咱們使用Google或Facebook,這個商店將依賴這些身份驗證提供商提供的客戶身份信息。在這種狀況下,網站惟一須要的是擁有信用卡 - 不管餘額如何
建立受權服務器
如今,讓咱們看看如何建立銀行、商店以及您須要的全部其餘內容。
首先,在咱們的項目中,咱們須要具備適當的依賴關係。咱們須要啓動者:Cloud OAuth2,Security和Web。
那麼,讓咱們從定義銀行開始; 這就是咱們以前說的: AuthorizationServerConfiguration:
咱們從 @ Configuration 標籤開始,而後使用 @EnableAuthorizationServer 標記告訴Spring激活受權服務器。要定義服務器屬性,咱們指定咱們的類擴展 AuthorizationServerConfigurerAdapter,實現了 AuthorizationServerConfigurerAdapter接口,因此Spring將使用這個類來參數化服務器。
咱們定義了一個Spring自動提供的AuthenticationManager ,咱們將使用它來收集@Autowired標籤。咱們還定義了一個 TokenStore對象,做爲public的功能 。
雖然 AuthenticationManager由Spring提供的,但咱們必須本身配置它。我等等解釋要如何完成這個配置。TokenStore或者IdentifierStore是身份驗證服務器提供的標識符將存儲的位置,所以當資源服務器(商店)要求信用卡上的信息時,身份驗證服務器就要響應它。在這種狀況下,咱們使用 InMemoryTokenStore將標識符存儲在內存中的類。在實際應用中,咱們可使用JdbcTokenStore將它們保存在數據庫中,以便在應用程序發生故障時,客戶端沒必要更新其信用卡。
在功能配置中 (ClientDetailsServiceConfigurer clients),咱們指定銀行的憑證,包括身份驗證的管理員,以及提供的服務。由於要訪問銀行,咱們必須爲每一個提供的服務提供用戶名和密碼。這是一個很是重要的概念:用戶名和密碼來自銀行,而不是客戶。對於銀行提供的每項服務,將進行單一認證,但對於不一樣的服務可能相同。
我將詳細說明這些內容:
clients.inMemory ()指定咱們將服務存儲在內存中。在「真正的」應用程序中,咱們將其保存在數據庫,LDAP服務器等中。
withClient ("client")是咱們將在銀行中識別的用戶。在這種狀況下,它將被稱爲「客戶端」。將他稱爲「用戶」會不會更好?
要 uthorizedGrantTypes ("password", "authorization_code", "refresh_token", "implicit") ,咱們指定配置定義的用戶,對服務「 客戶端 」。在咱們的示例中,咱們將僅使用密碼服務。
authorities ("ROLE_CLIENT", "ROLE_TRUSTED_CLIENT", "USER") 指定所提供服務包含的角色或組。咱們也不會在咱們的例子中使用它,因此讓咱們讓它暫時運行。
scopes ("read", "write") 是服務的範圍 - 咱們也不會在咱們的應用程序中使用它。
autoApprove (true)-若是您必須自動批准客戶的請求,咱們會說是,以使應用程序更簡單。
secret (passwordEncoder (). encode ("password")) 是客戶端的密碼。請注意,調用咱們稍後定義的編碼函數來指定密碼將保存在何種類型的加密中。的編碼功能進行註釋與@Bean標籤由於Spring,當咱們在HTTP請求中提供密碼時,會查找一個 PasswordEncoder對象檢查交付密碼的有效性。
最後,咱們有一個函數 configure (AuthorizationServerEndpointsConfigurer endpoints) ,咱們定義哪一個身份驗證控制器和標識符存儲應該使用端點。澄清終點是咱們將與咱們的「銀行」聯繫以請求卡的URL。
如今,咱們已經建立了咱們的身份驗證服務器,可是根據引入的憑據,咱們仍然須要他知道咱們是誰並將咱們放在不一樣的組中的方式。好吧,爲此,咱們將使用與保護網頁相同的類。
如今,咱們能夠檢查咱們的受權服務器是否有效。讓咱們看看如何使用優秀的PostMan程序。
咱們將使用HTTP請求類型POST,代表咱們要使用基本驗證。在咱們的示例中,咱們將分別使用「client」和「password」來設置用戶和密碼,即「銀行」的密碼。
在請求正文和form-url編碼格式中,咱們將介紹要請求的服務,用戶名和密碼。
'access_token'「 8279b6f2-013d-464a-b7da-33fe37ca9afb 」是咱們的信用卡,是咱們必須提供給咱們的資源服務器(商店)以查看非公開的頁面(資源)的信用卡。
建立資源服務器(ResourceServer)
如今咱們有了信用卡,咱們將建立接受該卡的商店。
在咱們的示例中,咱們將使用Spring Boot在相同的程序中建立資源和身份驗證服務器,它無需配置任何內容。若是像現實生活中同樣,資源服務器在一個地方,而身份驗證服務器在另外一個地方,咱們應該向資源服務器指出哪一個是咱們的「銀行」以及如何與之交談。可是,咱們將把它留給另外一個條目。
資源服務器的惟一類是 ResourceServerConfiguration:
因爲身份驗證和資源服務器在同一個程序中,咱們只須要配置資源服務器的安全性。這是在函數中完成的:
一旦咱們建立了資源服務器,咱們必須只建立服務,這些服務是經過這些行完成的:
如今讓咱們看看驗證的工做原理。
首先,咱們檢查咱們是否能夠在沒有任何驗證的狀況下訪問「/ publica」:
若是我嘗試訪問「/ private」頁面,則會收到錯誤「401 unauthorized」,表示咱們無權查看該頁面,所以咱們將使用咱們的受權服務器給用戶受權。
若是咱們能夠看到咱們的私人頁面,那麼讓咱們嘗試管理員的頁面:
咱們固然沒辦法看到管理員的界面。所以,咱們將要求憑據管理員提供新令牌,但要向用戶「管理員」代表身份。
返回的令牌是:「ab205ca7-bb54-4d84-a24d-cad4b7aeab57。」 這樣就沒問題了,咱們能夠安全地去購物!如今,咱們只須要設置商店並擁有產品。
本人創業團隊產品MadPecker,主要作BUG管理、測試管理、應用分發,有須要的朋友歡迎試用、體驗!
本文爲MadPecker團隊產品經理譯製,轉載請標明出處數據庫