SpringBoot集成OAuth2.0的實(shí)現(xiàn)示例
OAuth 2.0 介紹
概念
OAuth 2.0 是一個(gè)開放標(biāo)準(zhǔn)的授權(quán)協(xié)議,它允許用戶授權(quán)第三方應(yīng)用訪問其在另一個(gè)服務(wù)提供商處存儲(chǔ)的受保護(hù)資源,而無(wú)需將自己的用戶名和密碼直接提供給第三方應(yīng)用。這極大地增強(qiáng)了用戶數(shù)據(jù)的安全性和隱私性,廣泛應(yīng)用于各種需要第三方授權(quán)訪問的場(chǎng)景,如社交登錄、第三方應(yīng)用獲取用戶在云存儲(chǔ)服務(wù)中的文件等。
與傳統(tǒng)認(rèn)證方式的對(duì)比
- 傳統(tǒng)認(rèn)證方式:通常要求用戶直接向第三方應(yīng)用提供其在服務(wù)提供商處的用戶名和密碼,這存在密碼泄露的風(fēng)險(xiǎn)。一旦第三方應(yīng)用的安全性出現(xiàn)問題,用戶的賬戶信息將面臨嚴(yán)重威脅。
- OAuth 2.0:用戶只需在服務(wù)提供商的授權(quán)頁(yè)面上進(jìn)行授權(quán)操作,第三方應(yīng)用獲得的是訪問令牌(Access Token),而非用戶的原始憑據(jù)。即使令牌泄露,攻擊者也只能在令牌的有效期和權(quán)限范圍內(nèi)訪問資源,且令牌可以被服務(wù)提供商隨時(shí)撤銷。
常見應(yīng)用場(chǎng)景
- 社交登錄:許多網(wǎng)站和應(yīng)用允許用戶使用社交媒體賬號(hào)(如微信、QQ、微博、Google、Facebook 等)進(jìn)行登錄。用戶無(wú)需在新平臺(tái)上注冊(cè)新賬號(hào),只需授權(quán)平臺(tái)訪問其社交賬號(hào)的基本信息,即可快速完成登錄。
- 第三方數(shù)據(jù)訪問:例如,一個(gè)健身應(yīng)用可以請(qǐng)求用戶授權(quán)訪問其在運(yùn)動(dòng)追蹤服務(wù)提供商處的運(yùn)動(dòng)數(shù)據(jù),以便為用戶提供更全面的健身分析和建議。
- API 訪問:開發(fā)者在開發(fā)第三方應(yīng)用時(shí),需要調(diào)用某些服務(wù)提供商的 API 來(lái)獲取數(shù)據(jù)或執(zhí)行操作。通過(guò) OAuth 2.0 授權(quán),開發(fā)者可以在不暴露用戶敏感信息的情況下,合法地使用這些 API。
OAuth 2.0 原理
核心角色
- 資源所有者(Resource Owner):一般是用戶,擁有受保護(hù)的資源,并有權(quán)決定是否授權(quán)第三方應(yīng)用訪問這些資源。例如,用戶在 Facebook 上的個(gè)人信息和照片就是受保護(hù)資源,用戶可以決定是否允許某個(gè)第三方游戲應(yīng)用訪問這些信息。
- 資源服務(wù)器(Resource Server):存儲(chǔ)受保護(hù)資源的服務(wù)器。它負(fù)責(zé)驗(yàn)證訪問令牌的有效性,并在驗(yàn)證通過(guò)后向第三方應(yīng)用提供相應(yīng)的資源。例如,F(xiàn)acebook 的服務(wù)器存儲(chǔ)了用戶的個(gè)人信息和照片,當(dāng)?shù)谌綉?yīng)用攜帶有效的訪問令牌請(qǐng)求這些資源時(shí),F(xiàn)acebook 的服務(wù)器會(huì)進(jìn)行驗(yàn)證并返回?cái)?shù)據(jù)。
- 客戶端(Client):即第三方應(yīng)用,希望訪問用戶的受保護(hù)資源??蛻舳诵枰全@得用戶的授權(quán),然后使用授權(quán)服務(wù)器頒發(fā)的訪問令牌來(lái)訪問資源服務(wù)器上的資源。例如,上述的第三方游戲應(yīng)用就是客戶端。
- 授權(quán)服務(wù)器(Authorization Server):負(fù)責(zé)驗(yàn)證資源所有者的身份,處理授權(quán)請(qǐng)求,并發(fā)放訪問令牌。它與資源所有者進(jìn)行交互,確認(rèn)用戶是否同意授權(quán)給客戶端,并在用戶授權(quán)后生成并返回訪問令牌。例如,F(xiàn)acebook 的授權(quán)服務(wù)器會(huì)驗(yàn)證用戶的身份,顯示授權(quán)頁(yè)面,當(dāng)用戶點(diǎn)擊“同意”后,生成訪問令牌并返回給客戶端。
授權(quán)流程
OAuth 2.0 定義了四種授權(quán)模式,下面詳細(xì)介紹最常用的授權(quán)碼模式(Authorization Code Grant):
- 客戶端請(qǐng)求授權(quán):客戶端引導(dǎo)用戶到授權(quán)服務(wù)器的授權(quán)端點(diǎn),請(qǐng)求用戶授權(quán)。請(qǐng)求中包含客戶端 ID、重定向 URI、請(qǐng)求的權(quán)限范圍等信息。例如,當(dāng)用戶在第三方游戲應(yīng)用中選擇使用 Facebook 賬號(hào)登錄時(shí),應(yīng)用會(huì)將用戶重定向到 Facebook 的授權(quán)頁(yè)面,并攜帶應(yīng)用的客戶端 ID、指定的重定向 URI 以及請(qǐng)求的權(quán)限范圍(如獲取用戶的基本信息、好友列表等)。
- 用戶授權(quán):用戶在授權(quán)服務(wù)器的頁(yè)面上登錄并確認(rèn)是否授權(quán)給客戶端訪問其資源。例如,用戶在 Facebook 的授權(quán)頁(yè)面上輸入自己的賬號(hào)密碼登錄后,會(huì)看到一個(gè)授權(quán)提示,顯示第三方應(yīng)用請(qǐng)求的權(quán)限范圍,用戶可以選擇“同意”或“拒絕”。
- 授權(quán)服務(wù)器返回授權(quán)碼:如果用戶授權(quán),授權(quán)服務(wù)器將用戶重定向回客戶端指定的重定向 URI,并附帶一個(gè)授權(quán)碼(Authorization Code)。授權(quán)碼是一個(gè)臨時(shí)的、一次性的代碼,用于后續(xù)換取訪問令牌。例如,用戶點(diǎn)擊“同意”后,F(xiàn)acebook 的授權(quán)服務(wù)器會(huì)將用戶重定向回第三方游戲應(yīng)用指定的重定向 URI,并在 URL 中附帶授權(quán)碼。
- 客戶端換取訪問令牌:客戶端使用接收到的授權(quán)碼向授權(quán)服務(wù)器的令牌端點(diǎn)發(fā)送請(qǐng)求,同時(shí)提供客戶端 ID 和客戶端密鑰進(jìn)行身份驗(yàn)證。授權(quán)服務(wù)器驗(yàn)證通過(guò)后,返回訪問令牌(Access Token)和可選的刷新令牌(Refresh Token)。例如,第三方游戲應(yīng)用接收到授權(quán)碼后,會(huì)向 Facebook 的令牌端點(diǎn)發(fā)送請(qǐng)求,攜帶授權(quán)碼、客戶端 ID 和客戶端密鑰,F(xiàn)acebook 的授權(quán)服務(wù)器驗(yàn)證這些信息無(wú)誤后,會(huì)返回訪問令牌和可能的刷新令牌。
- 客戶端訪問資源:客戶端使用訪問令牌向資源服務(wù)器發(fā)送請(qǐng)求,資源服務(wù)器驗(yàn)證令牌的有效性,驗(yàn)證通過(guò)后返回受保護(hù)的資源。例如,第三方游戲應(yīng)用使用接收到的訪問令牌向 Facebook 的資源服務(wù)器請(qǐng)求用戶的基本信息,資源服務(wù)器驗(yàn)證令牌有效后,會(huì)返回用戶的姓名、頭像等信息。
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ā)者設(shè)置中創(chuàng)建的實(shí)際客戶端 ID 和客戶端密鑰。
3. 配置 Spring Security
創(chuàng)建一個(gè)配置類來(lái)配置 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)建一個(gè)簡(jiǎn)單的控制器來(lái)測(cè)試 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. 主應(yīng)用類
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依賴,為項(xiàng)目提供 Web 服務(wù)和 OAuth 2.0 客戶端支持。 - 配置文件:在
application.yml中配置了 GitHub 的 OAuth 2.0 客戶端信息,包含客戶端 ID、客戶端密鑰、授權(quán) URI、令牌 URI 以及用戶信息 URI 等。 - SecurityConfig 類:對(duì) Spring Security 進(jìn)行配置,要求所有請(qǐng)求都需經(jīng)過(guò)身份驗(yàn)證,并啟用 OAuth 2.0 登錄。
- HomeController 類:提供一個(gè)簡(jiǎn)單的端點(diǎn)
/,只有經(jīng)過(guò)身份驗(yàn)證的用戶才能訪問。 - 主應(yīng)用類:?jiǎn)?dòng) Spring Boot 應(yīng)用。
按照上述步驟操作,就能在 Spring Boot 項(xiàng)目中集成 OAuth 2.0 認(rèn)證。啟動(dòng)應(yīng)用后,訪問項(xiàng)目根路徑,會(huì)自動(dòng)跳轉(zhuǎn)到 GitHub 的授權(quán)頁(yè)面,授權(quán)成功后即可訪問受保護(hù)的資源。
到此這篇關(guān)于SpringBoot集成OAuth2.0的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)SpringBoot OAuth2.0內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot3.X配置OAuth的代碼實(shí)踐
- SpringBoot的Security和OAuth2的使用示例小結(jié)
- 使用Springboot實(shí)現(xiàn)OAuth服務(wù)的示例詳解
- SpringBoot淺析安全管理之OAuth2框架
- springboot oauth2實(shí)現(xiàn)單點(diǎn)登錄實(shí)例
- springboot集成springsecurity 使用OAUTH2做權(quán)限管理的教程
- 基于SpringBoot整合oauth2實(shí)現(xiàn)token認(rèn)證
- springboot2.x實(shí)現(xiàn)oauth2授權(quán)碼登陸的方法
- 詳解Springboot Oauth2 Server搭建Oauth2認(rèn)證服務(wù)
- 使用Springboot搭建OAuth2.0 Server的方法示例
相關(guān)文章
Reactor 多任務(wù)并發(fā)執(zhí)行且結(jié)果按順序返回第一個(gè)
這篇文章主要介紹了Reactor 多任務(wù)并發(fā)執(zhí)行且結(jié)果按順序返回第一個(gè),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下2022-09-09
intellij idea 啟動(dòng)tomcat 1099端口被占用的解決
這篇文章主要介紹了intellij idea 啟動(dòng)tomcat 1099端口被占用的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
Feign調(diào)用服務(wù)時(shí)丟失Cookie和Header信息的解決方案
這篇文章主要介紹了Feign調(diào)用服務(wù)時(shí)丟失Cookie和Header信息的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
java調(diào)用FFmpeg實(shí)現(xiàn)視屏壓縮功能的詳細(xì)步驟
這篇文章主要介紹了java調(diào)用FFmpeg實(shí)現(xiàn)視屏壓縮功能,本文簡(jiǎn)單的展示了java調(diào)用FFmpeg命令實(shí)現(xiàn)視屏的壓縮的詳細(xì)步驟,需要的朋友可以參考下2021-09-09
spring mvc4中相關(guān)注解的詳細(xì)講解教程
這篇文章主要給大家介紹了關(guān)于spring mvc4中相關(guān)注解的相關(guān)資料,其中詳細(xì)介紹了關(guān)于@Controller、@RequestMapping、@RathVariable、@RequestParam及@RequestBody等等注解的相關(guān)內(nèi)容,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-06-06
springboot配置多數(shù)據(jù)源(靜態(tài)和動(dòng)態(tài)數(shù)據(jù)源)
在開發(fā)過(guò)程中,很多時(shí)候都會(huì)有垮數(shù)據(jù)庫(kù)操作數(shù)據(jù)的情況,需要同時(shí)配置多套數(shù)據(jù)源,本文主要介紹了springboot配置多數(shù)據(jù)源(靜態(tài)和動(dòng)態(tài)數(shù)據(jù)源),感興趣的可以了解一下2023-09-09

