javascript
rest api如何创建_创建一个安全的Spring REST API
rest api如何創建
“我喜歡編寫身份驗證和授權代碼。” ?從來沒有Java開發人員。 厭倦了一次又一次地建立相同的登錄屏幕? 嘗試使用Okta API進行托管身份驗證,授權和多因素身份驗證。
“如果有用,它將被修改。” 那些智慧的話來自我的QA老師,他們解釋說,只要對某人有用,并且只要它有用,所有軟件都會發展。 我們都知道這一點。 用戶每天都要求我們提供新功能,錯誤修復和域邏輯更改。 隨著任何項目(尤其是整體項目)的增長,它可能開始變得難以維護,并且任何新項目的進入門檻都將越來越高。 在本教程中,我很高興引導您構建安全的Spring REST API,該API試圖使用微服務架構來解決其中的一些難點。
在微服務架構中,您在邏輯上將應用程序劃分為多個應用程序,這些應用程序可以更輕松地維護和擴展,使用不同的堆棧,并支持更多并行工作的團隊。 但是微服務是解決每個擴展和維護問題的簡單解決方案。
微服務還提出了許多必須解決的架構挑戰:
- 這些服務如何通信?
- 通信故障和可用性應如何處理?
- 如何在服務之間跟蹤用戶的請求?
- 而且,您應該如何處理用戶授權才能訪問單個服務?
讓我們深入研究并了解在構建Spring REST API時如何應對這些挑戰。
使用OAuth 2.0保護Spring REST API的安全
在OAuth 2.0中 ,資源服務器是一種旨在處理域邏輯請求的服務,并且沒有任何類型的登錄工作流程或復雜的身份驗證機制:資源服務器接收預先獲得的訪問令牌,該令牌可確保用戶具有訪問服務器的授權權限并提供預期的響應。
在本文中,您將使用Spring Boot和Okta構建一個簡單的Resource Server ,以演示它的簡單性。 您將實現一個簡單的資源服務器 ,該服務器將接收并驗證JWT令牌 。
將資源服務器添加到Spring REST API
本示例使用Okta處理所有身份驗證過程。 您可以注冊一個永久免費的開發者帳戶 ,該帳戶使您可以創建所需的任意數量的用戶和應用程序。
我已經設置了一些東西,所以我們可以輕松上手。 請克隆以下資源存儲庫并轉到startup標記,如下所示:
git clone -b startup https://github.com/oktadeveloper/okta-secure-spring-rest-api-example secure-spring-rest-api cd secure-spring-rest-api該項目具有以下結構:
$ tree . . ├── README.md ├── mvnw ├── mvnw.cmd ├── pom.xml └── src├── main│ ├── java│ │ └── net│ │ └── dovale│ │ └── okta│ │ └── secure_rest_api│ │ ├── HelloWorldController.java│ │ ├── SecureRestApiApplication.java│ │ └── SecurityConfig.java│ └── resources│ └── application.properties└── test└── java└── net└── dovale└── okta└── secure_rest_api└── SecureRestApiApplicationTests.java14 directories, 9 files我使用出色的Spring Initializr并添加了Web和Security依賴關系來創建它。 Spring Initializr提供了一種簡單的方法來創建具有一些常見的自動發現的依賴關系的新Spring Boot服務。 它還會添加Maven包裝程序 :因此,您使用命令mvnw而不是mvn ,該工具將檢測您是否具有指定的Maven版本,如果沒有,則將下載并運行指定的命令。
有趣的事實 :您知道Maven包裝器最初是由Okta自己的Brian Demers創建的嗎?
文件HelloWorldController是一個簡單的@RestController ,它輸出“ Hello World”。
在終端中,您可以運行以下命令并查看Spring Boot啟動:
mvnw spring-boot:run提示:如果該命令不適合您,請嘗試使用./mvnw spring-boot:run代替。
完成加載后,您將準備好REST API,并設置為向您傳遞光彩的Hello World消息!
> curl http://localhost:8080/ Hello World提示:默認情況下, curl命令對于Windows用戶不可用。 您可以從這里下載。
現在,您需要正確創建一個受保護的資源服務器 。
設置OAuth 2.0資源服務器
在Okta儀表板中,創建Service類型的應用程序,它表示資源服務器沒有登錄頁面或任何獲取新令牌的方式。
點擊下一步 ,輸入您的服務名稱,然后點擊完成 。 您將看到與以下屏幕類似的屏幕。 復制并粘貼您的客戶端ID和客戶端密鑰以供以后使用。 當您配置應用程序時,它們將非常有用。
現在,讓我們編寫一些代碼!
編輯pom.xml文件,并添加Spring Security和Okta的依賴項。 它們將啟用您需要的所有Spring AND Okta OAuth 2.0功能:
<!-- security - begin --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-oauth2</artifactId> </dependency> <dependency><groupId>com.okta.spring</groupId><artifactId>okta-spring-boot-starter</artifactId><version>0.6.1</version> </dependency> <!-- security - end -->通過簡單地添加此依賴關系,您的代碼將像沒有鑰匙的鎖屋。 在向用戶提供密鑰之前,沒有人可以訪問您的API。 再次運行以下命令。
mvnw spring-boot:run現在,嘗試訪問Hello World資源:
> curl http://localhost:8080/ {"timestamp":"2018-11-30T01:35:30.038+0000","status":401,"error":"Unauthorized","message":"Unauthorized","path":"/"}將Spring Security添加到您的REST API
Spring Boot具有很多類路徑魔術,并且能夠發現并自動配置依賴項。 既然您已經添加了Spring Security,它將自動保護您的資源。 現在,您需要配置Spring Security,以便可以正確地驗證請求。
注意:如果您遇到困難,可以在Git分支step-1-security-dependencies檢查修改。
為此,您需要按以下方式修改application.properties (使用Okta儀表板提供給應用程序的client_id和client_secret ):
okta.oauth2.issuer=https://{yourOktaDomain}/oauth2/default okta.oauth2.clientId={clientId} okta.oauth2.clientSecret={clientSecret} okta.oauth2.scopes=openidSpring Boot使用注釋和代碼來配置您的應用程序,因此您無需編輯超級無聊的XML文件。 這意味著您可以使用Java編譯器來驗證您的配置!
我通常在不同的類中創建配置,每個類都有其自己的用途。 創建類net.dovale.okta.secure_rest_api.SecurityConfig ,如下所示:
package net.dovale.okta.secure_rest_api;import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;@EnableWebSecurity @EnableResourceServer public class SecurityConfig {}請允許我解釋這里的注釋的作用:
- @EnableWebSecurity –告訴Spring我們將使用Spring Security提供Web安全機制
- @EnableResourceServer –方便的批注,可通過OAuth 2.0令牌啟用請求身份驗證。 通常,您會提供一個ResourceServerConfigurer bean,但是Okta的Spring Boot啟動器很方便地為您提供了一個。
而已! 現在,您擁有了一個完全配置且受保護的Spring REST API,而沒有任何樣板!
再次運行Spring Boot并使用cURL進行檢查。
mvnw spring-boot:run # in another shell curl http://localhost:8080/ {"error":"unauthorized","error_description":"Full authentication is required to access this resource"}消息改變了,但是您仍然無法訪問...為什么? 因為現在服務器正在等待帶有有效令牌的authorization 標頭 。 在下一步中,您將創建一個訪問令牌并使用它來訪問您的API。
注意:如果有任何疑問,請檢查Git分支step-2-security-configuration 。
在您的Spring REST API中生成令牌
那么……您如何獲得令牌? 資源服務器不負責獲取有效的憑證:它只會檢查令牌是否有效并繼續執行方法。
一種使用OpenID Connect <debugger />實現令牌以生成令牌的簡單方法。
首先,您需要在Okta中創建一個新的Web應用程序:
將登錄重定向URI字段設置為https://oidcdebugger.com/debug并將Grant Type允許為Hybrid 。 單擊“完成”,然后復制客戶端ID,以進行下一步。
現在,在OpenID Connect網站上,如下圖所示填寫表單(不要忘記為您最近創建的Okta Web應用程序填寫客戶端ID):
提交表單以啟動身份驗證過程。 如果您尚未登錄,則將收到Okta登錄表單,否則您將在下面看到帶有自定義令牌的屏幕。
令牌的有效期為一小時,因此您可以使用API??進行大量測試。 使用令牌很簡單,只需將其復制并修改curl命令即可使用它,如下所示:
> export TOKEN=${YOUR_TOKEN} > curl http://localhost:8080 -H "Authorization: Bearer $TOKEN" Hello World添加OAuth 2.0范圍
OAuth 2.0范圍是一項功能,可讓用戶決定是否將授權該應用程序進行限制。 例如,您可能具有“讀取”和“寫入”范圍。 如果應用程序需要寫入范圍,則應詢問用戶該特定范圍。 這些可以由Okta的授權服務器自動處理。
作為資源服務器,它可以具有不同的端點,每個端點具有不同的范圍。 接下來,您將學習如何設置不同的范圍以及如何對其進行測試。
向您的SecurityConfig類添加一個新注釋:
@EnableWebSecurity @EnableResourceServer @EnableGlobalMethodSecurity(prePostEnabled = true) public class SecurityConfig {}新@EnableGlobalMethodSecurity(prePostEnabled = true)注解告訴Spring使用AOP樣方法的安全性和prePostEnabled = true使前 , 后的注釋。 這些注釋將使我們能夠以編程方式為每個端點定義安全性。
現在,對HelloWorldController.java進行更改以創建一個受范圍保護的端點:
import org.springframework.security.access.prepost.PreAuthorize; import java.security.Principal; ... @PreAuthorize("#oauth2.hasScope('profile')") @GetMapping("/protected/") public String helloWorldProtected(Principal principal) {return "Hello VIP " + principal.getName(); }注意@PreAuthorize("#oauth2.hasScope('profile')") 。 它說:在運行此方法之前,請驗證請求是否具有指定范圍的授權。 #oauth2位由OAuth2SecurityExpressionMethods Spring類添加(請檢查其他可用方法),并通過spring-cloud-starter-oauth2依賴關系添加到您的類路徑中。
好! 重新啟動后,您的服務器將準備就緒! 使用您當前的令牌向端點發出新請求:
> curl http://localhost:8080/protected/ -H "Authorization: Bearer $TOKEN" {"error":"access_denied","error_description":"Access is denied"}由于您的令牌沒有所需的范圍,因此您會收到一條access is denied消息。 要解決此問題,請回到OIDC調試器并添加新的作用域。
使用新獲得的令牌重試:
> curl http://localhost:8080/protected/ -H "Authorization: Bearer $TOKEN" Hello VIP raphael@dovale.net而已! 如果您有任何疑問,請檢查最新的存儲庫分支finished_sample 。
提示:由于profile是OAuth 2.0的常見范圍,因此您無需在授權服務器中進行任何更改。 需要創建自定義范圍嗎? 請參閱此Java應用程序的簡單令牌認證 。
了解有關Spring和REST API的更多信息
在本教程中,您學習了如何使用Spring(引導)創建資源服務器并將其與OAuth 2.0無縫集成。 Spring和REST API都是巨大的主題,有很多討論和學習的內容。
本教程的源代碼可在GitHub上找到 。
以下是一些其他文章,可幫助您進一步了解Spring和REST API安全性:
- OAuth到底是什么?
- 使用Spring Boot和OAuth 2.0進行安全的服務器到服務器通信
- Spring Boot 2.1:出色的OIDC,OAuth 2.0和React式API支持
- 在15分鐘內將用戶身份驗證添加到您的Spring Boot應用程序
“我喜歡編寫身份驗證和授權代碼。” ?從來沒有Java開發人員。 厭倦了一次又一次地建立相同的登錄屏幕? 嘗試使用Okta API進行托管身份驗證,授權和多因素身份驗證。
創建安全REST API''最初于2018年12月18日發布在Okta開發人員博客上。
翻譯自: https://www.javacodegeeks.com/2019/01/create-secure-spring-rest-api.html
rest api如何創建
總結
以上是生活随笔為你收集整理的rest api如何创建_创建一个安全的Spring REST API的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring框架介绍_Spring框架介
- 下一篇: 安卓手机怎么设置企业邮箱(安卓手机怎么设