SpringBoot集成OAuth2.0的實現(xiàn)示例
OAuth 2.0 介紹
概念
OAuth 2.0 是一個開放標準的授權協(xié)議,它允許用戶授權第三方應用訪問其在另一個服務提供商處存儲的受保護資源,而無需將自己的用戶名和密碼直接提供給第三方應用。這極大地增強了用戶數據的安全性和隱私性,廣泛應用于各種需要第三方授權訪問的場景,如社交登錄、第三方應用獲取用戶在云存儲服務中的文件等。
與傳統(tǒng)認證方式的對比
- 傳統(tǒng)認證方式:通常要求用戶直接向第三方應用提供其在服務提供商處的用戶名和密碼,這存在密碼泄露的風險。一旦第三方應用的安全性出現(xiàn)問題,用戶的賬戶信息將面臨嚴重威脅。
- OAuth 2.0:用戶只需在服務提供商的授權頁面上進行授權操作,第三方應用獲得的是訪問令牌(Access Token),而非用戶的原始憑據。即使令牌泄露,攻擊者也只能在令牌的有效期和權限范圍內訪問資源,且令牌可以被服務提供商隨時撤銷。
常見應用場景
- 社交登錄:許多網站和應用允許用戶使用社交媒體賬號(如微信、QQ、微博、Google、Facebook 等)進行登錄。用戶無需在新平臺上注冊新賬號,只需授權平臺訪問其社交賬號的基本信息,即可快速完成登錄。
- 第三方數據訪問:例如,一個健身應用可以請求用戶授權訪問其在運動追蹤服務提供商處的運動數據,以便為用戶提供更全面的健身分析和建議。
- API 訪問:開發(fā)者在開發(fā)第三方應用時,需要調用某些服務提供商的 API 來獲取數據或執(zhí)行操作。通過 OAuth 2.0 授權,開發(fā)者可以在不暴露用戶敏感信息的情況下,合法地使用這些 API。
OAuth 2.0 原理
核心角色
- 資源所有者(Resource Owner):一般是用戶,擁有受保護的資源,并有權決定是否授權第三方應用訪問這些資源。例如,用戶在 Facebook 上的個人信息和照片就是受保護資源,用戶可以決定是否允許某個第三方游戲應用訪問這些信息。
- 資源服務器(Resource Server):存儲受保護資源的服務器。它負責驗證訪問令牌的有效性,并在驗證通過后向第三方應用提供相應的資源。例如,F(xiàn)acebook 的服務器存儲了用戶的個人信息和照片,當第三方應用攜帶有效的訪問令牌請求這些資源時,F(xiàn)acebook 的服務器會進行驗證并返回數據。
- 客戶端(Client):即第三方應用,希望訪問用戶的受保護資源??蛻舳诵枰全@得用戶的授權,然后使用授權服務器頒發(fā)的訪問令牌來訪問資源服務器上的資源。例如,上述的第三方游戲應用就是客戶端。
- 授權服務器(Authorization Server):負責驗證資源所有者的身份,處理授權請求,并發(fā)放訪問令牌。它與資源所有者進行交互,確認用戶是否同意授權給客戶端,并在用戶授權后生成并返回訪問令牌。例如,F(xiàn)acebook 的授權服務器會驗證用戶的身份,顯示授權頁面,當用戶點擊“同意”后,生成訪問令牌并返回給客戶端。
授權流程
OAuth 2.0 定義了四種授權模式,下面詳細介紹最常用的授權碼模式(Authorization Code Grant):
- 客戶端請求授權:客戶端引導用戶到授權服務器的授權端點,請求用戶授權。請求中包含客戶端 ID、重定向 URI、請求的權限范圍等信息。例如,當用戶在第三方游戲應用中選擇使用 Facebook 賬號登錄時,應用會將用戶重定向到 Facebook 的授權頁面,并攜帶應用的客戶端 ID、指定的重定向 URI 以及請求的權限范圍(如獲取用戶的基本信息、好友列表等)。
- 用戶授權:用戶在授權服務器的頁面上登錄并確認是否授權給客戶端訪問其資源。例如,用戶在 Facebook 的授權頁面上輸入自己的賬號密碼登錄后,會看到一個授權提示,顯示第三方應用請求的權限范圍,用戶可以選擇“同意”或“拒絕”。
- 授權服務器返回授權碼:如果用戶授權,授權服務器將用戶重定向回客戶端指定的重定向 URI,并附帶一個授權碼(Authorization Code)。授權碼是一個臨時的、一次性的代碼,用于后續(xù)換取訪問令牌。例如,用戶點擊“同意”后,F(xiàn)acebook 的授權服務器會將用戶重定向回第三方游戲應用指定的重定向 URI,并在 URL 中附帶授權碼。
- 客戶端換取訪問令牌:客戶端使用接收到的授權碼向授權服務器的令牌端點發(fā)送請求,同時提供客戶端 ID 和客戶端密鑰進行身份驗證。授權服務器驗證通過后,返回訪問令牌(Access Token)和可選的刷新令牌(Refresh Token)。例如,第三方游戲應用接收到授權碼后,會向 Facebook 的令牌端點發(fā)送請求,攜帶授權碼、客戶端 ID 和客戶端密鑰,F(xiàn)acebook 的授權服務器驗證這些信息無誤后,會返回訪問令牌和可能的刷新令牌。
- 客戶端訪問資源:客戶端使用訪問令牌向資源服務器發(fā)送請求,資源服務器驗證令牌的有效性,驗證通過后返回受保護的資源。例如,第三方游戲應用使用接收到的訪問令牌向 Facebook 的資源服務器請求用戶的基本信息,資源服務器驗證令牌有效后,會返回用戶的姓名、頭像等信息。
Spring Boot 集成 OAuth 2.0
1. 添加依賴
在 pom.xml 中添加以下依賴:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
</dependencies>
2. 配置 OAuth 2.0 客戶端
在 application.yml 中配置 OAuth 2.0 客戶端信息,以 GitHub 為例:
spring:
security:
oauth2:
client:
registration:
github:
client-id: your-client-id
client-secret: your-client-secret
scope: read:user
provider:
github:
authorization-uri: https://github.com/login/oauth/authorize
token-uri: https://github.com/login/oauth/access_token
user-info-uri: https://api.github.com/user
將 your-client-id 和 your-client-secret 替換為你在 GitHub 開發(fā)者設置中創(chuàng)建的實際客戶端 ID 和客戶端密鑰。
3. 配置 Spring Security
創(chuàng)建一個配置類來配置 Spring Security 以支持 OAuth 2.0 登錄:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.oauth2Login();
return http.build();
}
}
4. 創(chuàng)建控制器
創(chuàng)建一個簡單的控制器來測試 OAuth 2.0 登錄后的訪問:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HomeController {
@GetMapping("/")
public String home() {
return "Welcome to the protected area! You are authenticated.";
}
}
5. 主應用類
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringBootOauth2DemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootOauth2DemoApplication.class, args);
}
}
代碼解釋
- 依賴部分:添加了
spring-boot-starter-web和spring-boot-starter-oauth2-client依賴,為項目提供 Web 服務和 OAuth 2.0 客戶端支持。 - 配置文件:在
application.yml中配置了 GitHub 的 OAuth 2.0 客戶端信息,包含客戶端 ID、客戶端密鑰、授權 URI、令牌 URI 以及用戶信息 URI 等。 - SecurityConfig 類:對 Spring Security 進行配置,要求所有請求都需經過身份驗證,并啟用 OAuth 2.0 登錄。
- HomeController 類:提供一個簡單的端點
/,只有經過身份驗證的用戶才能訪問。 - 主應用類:啟動 Spring Boot 應用。
按照上述步驟操作,就能在 Spring Boot 項目中集成 OAuth 2.0 認證。啟動應用后,訪問項目根路徑,會自動跳轉到 GitHub 的授權頁面,授權成功后即可訪問受保護的資源。
到此這篇關于SpringBoot集成OAuth2.0的實現(xiàn)示例的文章就介紹到這了,更多相關SpringBoot OAuth2.0內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- SpringBoot3.X配置OAuth的代碼實踐
- SpringBoot的Security和OAuth2的使用示例小結
- 使用Springboot實現(xiàn)OAuth服務的示例詳解
- SpringBoot淺析安全管理之OAuth2框架
- springboot oauth2實現(xiàn)單點登錄實例
- springboot集成springsecurity 使用OAUTH2做權限管理的教程
- 基于SpringBoot整合oauth2實現(xiàn)token認證
- springboot2.x實現(xiàn)oauth2授權碼登陸的方法
- 詳解Springboot Oauth2 Server搭建Oauth2認證服務
- 使用Springboot搭建OAuth2.0 Server的方法示例
相關文章
Reactor 多任務并發(fā)執(zhí)行且結果按順序返回第一個
這篇文章主要介紹了Reactor 多任務并發(fā)執(zhí)行且結果按順序返回第一個,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下2022-09-09
intellij idea 啟動tomcat 1099端口被占用的解決
這篇文章主要介紹了intellij idea 啟動tomcat 1099端口被占用的解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-09-09
Feign調用服務時丟失Cookie和Header信息的解決方案
這篇文章主要介紹了Feign調用服務時丟失Cookie和Header信息的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
java調用FFmpeg實現(xiàn)視屏壓縮功能的詳細步驟
這篇文章主要介紹了java調用FFmpeg實現(xiàn)視屏壓縮功能,本文簡單的展示了java調用FFmpeg命令實現(xiàn)視屏的壓縮的詳細步驟,需要的朋友可以參考下2021-09-09
springboot配置多數據源(靜態(tài)和動態(tài)數據源)
在開發(fā)過程中,很多時候都會有垮數據庫操作數據的情況,需要同時配置多套數據源,本文主要介紹了springboot配置多數據源(靜態(tài)和動態(tài)數據源),感興趣的可以了解一下2023-09-09

