1. 概述
Okta 提供身份驗證、授權和社交登錄等功能,適用於 Web、移動或 API 服務。 此外,它還對 Spring Framework 提供了強大的支持,從而使集成變得非常簡單。
在本教程中,我們將探索 Spring Security 與 Okta 結合使用,並設置一個最小化的 Okta 開發者賬户。
2. 設置 Okta
Okta 的設置過程如下:
-
創建 Okta 組織:
- 在 Okta 網站上創建一個新的 Okta 組織。
- 按照提示填寫組織信息,包括域名、管理員郵箱等。
-
添加用户:
- 在 Okta 管理控制枱中,添加需要訪問 Okta 應用的用户。
- 為每個用户設置密碼,並配置他們的角色和權限。
-
配置 Okta 應用:
- 根據需要,配置 Okta 應用,例如:
- 設置身份驗證方法(例如:密碼、多因素身份驗證)。
- 配置 SAML 2.0 或 OIDC 身份驗證。
- 設置應用的屬性和自定義設置。
- 根據需要,配置 Okta 應用,例如:
-
集成應用:
- 將 Okta 應用與您的應用程序集成,以便用户可以使用 Okta 進行身份驗證。
- 按照應用程序的文檔,配置應用程序以使用 Okta 進行身份驗證。
-
測試集成:
- 完成集成後,務必進行測試,以確保用户可以成功使用 Okta 進行身份驗證。
2.1. 開發者賬户註冊
首先,我們將註冊一個免費的 Okta 開發者賬户,該賬户可提供高達每月 1000 個活躍用户的訪問權限。但是,如果已經擁有一個賬户,則可以跳過此部分。
2.2. 儀表盤
登錄到 Okta 開發人員帳户後,您將到達儀表盤屏幕,該屏幕會提供有關用户數、身份驗證次數和失敗登錄次數的信息。
此外,它還顯示了系統的詳細日誌記錄:
您還會注意到儀表盤右上角顯示的 組織 URL,該 URL 用於在稍後創建的 Spring Boot 應用程序中設置 Okta。
2.3. 創建新應用程序
然後,我們使用“應用程序”菜單創建一個用於 Spring Boot 的 OpenID Connect (OIDC) 應用程序。
此外,我們還將從可用的選項中選擇 Web 平台,例如 Native、單頁應用程序 和 服務。
2.4. 應用程序設置
接下來,讓我們配置一些應用程序設置,例如 基本 URI 和 登錄重定向 URI,指向我們的應用程序:
此外,請確保標記 授權碼 用於 允許的授權類型,以便為 Web 應用程序啓用 OAuth2 身份驗證。
2.5. 客户端憑據
然後,我們將獲取與我們的應用程序關聯的 客户端 ID 和 客户端密鑰 的值:
請妥善保管這些憑據,因為它們是 Okta 設置所需的。
3. Spring Boot 應用設置
現在,我們的 Okta 開發者賬户已準備就緒,並配置了必要的設置,我們已準備好將 Okta 安全支持集成到 Spring Boot 應用中。
3.1. Maven
首先,讓我們將最新的 okta-spring-boot-starter Maven 依賴添加到我們的 pom.xml 中:
<dependency>
<groupId>com.okta.spring</groupId>
<artifactId>okta-spring-boot-starter</artifactId>
<version>3.0.6</version>
</dependency>3.2. Gradle
同樣,在使用 Gradle 時,可以在 build.gradle 中添加 okta-spring-boot-starter 依賴:
compile 'com.okta.spring:okta-spring-boot-starter:1.4.0'3.3. application.properties
接下來,我們將配置 Okta oauth2 屬性,位於 application.properties 中:
okta.oauth2.issuer=https://dev-example123.okta.com/oauth2/default
okta.oauth2.client-id=1230oaa4yncmaxaQ90ccJwl4x6
okta.oauth2.client-secret=hjiyblEzgT0ItY91Ywcdzwa78oNhtrYqNklQ5vLzvruT123
okta.oauth2.redirect-uri=/authorization-code/callback在這裏,我們可以使用默認的授權服務器(如果未提供其他選項)來設置 發行者(issuer) URL,該 URL 指向 {orgURL}/oauth2/default
此外,我們可以在 Okta 開發人員帳户中通過使用 API 菜單創建新的授權服務器:
然後,我們將從上一部分生成的 Okta 應用的 客户端 ID 和 客户端密鑰 添加到。
最後,我們已配置與在應用程序設置中設置的相同的 重定向 URI。
4. HomeController
接下來,我們創建 HomeController 類:
@RestController
public class HomeController {
@GetMapping("/")
public String home(@AuthenticationPrincipal OidcUser user) {
return "Welcome, "+ user.getFullName() + "!";
}
}在這裏,我們添加了 home 方法,並配置了 Base Uri (/) 映射,該映射位於應用程序設置中。
此外,home 方法的參數是一個 OidcUser 類實例,該類由 Spring Security 提供,用於訪問用户信息。
就這麼簡單!我們的 Spring Boot App 已經配置了 Okta 安全支持。讓我們使用 Maven 命令運行我們的應用程序:
mvn spring-boot:run訪問應用程序時,在 localhost:8080,我們將看到 Okta 提供的默認登錄頁面:
使用註冊用户憑據登錄後,將顯示包含用户全名的歡迎消息:
此外,我們會在默認登錄屏幕的底部找到“註冊”鏈接,用於自助註冊。
5. 註冊
5.1. 自注冊
首次使用時,您可以通過“註冊”鏈接創建 Okta 賬户,並提供如電子郵件、名字和姓氏等信息:
5.2. 創建用户
或者,我們可以從 Okta 開發人員賬户的 Users 菜單中創建一個新用户:
5.3. 自助註冊設置
此外,可以通過 Okta 開發者賬户中的 用户 菜單配置註冊和登錄設置。
6. Okta Spring SDK
現在我們已經瞭解了在 Spring Boot 應用中集成 Okta 安全,接下來將在同一應用中與 Okta 管理 API 進行交互。
首先,我們應該通過 Okta 開發者賬户的 API 菜單創建 令牌:
請務必 記錄 令牌,因為它在生成後僅顯示一次。然後,它將被存儲為我們的保護哈希。
6.1. 部署準備
然後,我們將最新的 okta-spring-sdk Maven 依賴添加到我們的 pom.xml 中:
<dependency>
<groupId>com.okta.spring</groupId>
<artifactId>okta-spring-sdk</artifactId>
<version>1.4.0</version>
</dependency>6.2. application.properties</h3
接下來,我們將添加一些必要的 Okta 客户端屬性:
okta.client.orgUrl=https://dev-example123.okta.com
okta.client.token=00TVXDNx1e2FgvxP4jLlONbPMzrBDLwESSf9hZSvMI123在此,我們添加了之前章節中提到的令牌。
6.3. AdminController
最後,我們創建 AdminController,並注入了 Client 實例:
@RestController
public class AdminController {
@Autowired
public Client client;
}這就是全部!我們準備好調用 Client 實例的方法,向 Okta API 發送請求。
6.4. 獲取用户列表
讓我們創建一個名為 getUsers 的方法,以從組織中檢索所有用户列表,並使用 listUsers 方法返回 UserList 對象:
public class AdminController {
// ...
@GetMapping("/users")
public UserList getUsers() {
return client.listUsers();
}
}之後,我們可以通過訪問 localhost:8080/users 來獲取一個包含所有用户的 JSON 響應:
{
"dirty":false,
"propertyDescriptors":{
"items":{
"name":"items",
"type":"com.okta.sdk.resource.user.User"
}
},
"resourceHref":"/api/v1/users",
"currentPage":{
"items":[
{
"id":"00uanxiv7naevaEL14x6",
"profile":{
"firstName":"Anshul",
"lastName":"Bansal",
"email":"[email protected]",
// ...
},
// ...
},
{
"id":"00uag6vugXMeBmXky4x6",
"profile":{
"firstName":"Ansh",
"lastName":"Bans",
"email":"[email protected]",
// ...
},
// ...
}
]
},
"empty":false,
// ...
}6.5. 搜索用户
同樣,我們可以使用 firstName、lastName 或 email 作為查詢參數來過濾用户:
@GetMapping("/user")
public UserList searchUserByEmail(@RequestParam String query) {
return client.listUsers(query, null, null, null, null);
}讓我們通過email 搜索用户,使用以下鏈接:localhost:8080/郵箱:http://localhost:8080/user?query=ansh@bans.com
{
"dirty":false,
"propertyDescriptors":{
"items":{
"name":"items",
"type":"com.okta.sdk.resource.user.User"
}
},
"resourceHref":"/api/v1/users?q=ansh%40bans.com",
"currentPage":{
"items":[
{
"id":"00uag6vugXMeBmXky4x6",
"profile":{
"firstName":"Ansh",
"lastName":"Bans",
"email":"[email protected]",
// ...
},
// ...
}
]
},
// ...
}6.6. 創建用户
此外,我們還可以通過使用 UserBuilder 接口的 instance 方法創建新的用户:
@GetMapping("/createUser")
public User createUser() {
char[] tempPassword = {'P','a','$','$','w','0','r','d'};
User user = UserBuilder.instance()
.setEmail("[email protected]")
.setFirstName("Norman")
.setLastName("Lewis")
.setPassword(tempPassword)
.setActive(true)
.buildAndCreate(client);
return user;
}讓我們訪問 localhost:8080/createUser 並驗證新用户的詳細信息:
{
"id": "00uauveccPIYxQKUf4x6",
"profile": {
"firstName": "Norman",
"lastName": "Lewis",
"email": "[email protected]"
},
"credentials": {
"password": {},
"emails": [
{
"value": "[email protected]",
"status": "VERIFIED",
"type": "PRIMARY"
}
],
// ...
},
"_links": {
"resetPassword": {
"href": "https://dev-example123.okta.com/api/v1/users/00uauveccPIYxQKUf4x6/lifecycle/reset_password",
"method": "POST"
},
// ...
}
}同樣,我們還可以執行一系列操作,例如列出所有應用程序、創建應用程序、列出所有組以及創建組。
7. 結論
在本快速教程中,我們探討了 Spring Security 與 Okta 的集成。
首先,我們設置了 Okta 開發者賬户並進行了必要的配置。然後,我們創建了一個 Spring Boot 應用,並配置了 application.properties 以進行 Spring Security 與 Okta 的集成。
接下來,我們集成 Okta Spring SDK 以管理 Okta API。最後,我們瞭解了列出所有用户、搜索用户和創建用户等功能。