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ù)提供商處存儲的受保護(hù)資源,而無需將自己的用戶名和密碼直接提供給第三方應(yīng)用。這極大地增強(qiáng)了用戶數(shù)據(jù)的安全性和隱私性,廣泛應(yīng)用于各種需要第三方授權(quán)訪問的場景,如社交登錄、第三方應(yīng)用獲取用戶在云存儲服務(wù)中的文件等。
與傳統(tǒng)認(rèn)證方式的對比
- 傳統(tǒng)認(rèn)證方式:通常要求用戶直接向第三方應(yīng)用提供其在服務(wù)提供商處的用戶名和密碼,這存在密碼泄露的風(fēng)險(xiǎn)。一旦第三方應(yīng)用的安全性出現(xiàn)問題,用戶的賬戶信息將面臨嚴(yán)重威脅。
- OAuth 2.0:用戶只需在服務(wù)提供商的授權(quán)頁面上進(jìn)行授權(quán)操作,第三方應(yīng)用獲得的是訪問令牌(Access Token),而非用戶的原始憑據(jù)。即使令牌泄露,攻擊者也只能在令牌的有效期和權(quán)限范圍內(nèi)訪問資源,且令牌可以被服務(wù)提供商隨時(shí)撤銷。
常見應(yīng)用場景
- 社交登錄:許多網(wǎng)站和應(yīng)用允許用戶使用社交媒體賬號(如微信、QQ、微博、Google、Facebook 等)進(jìn)行登錄。用戶無需在新平臺上注冊新賬號,只需授權(quán)平臺訪問其社交賬號的基本信息,即可快速完成登錄。
- 第三方數(shù)據(jù)訪問:例如,一個(gè)健身應(yīng)用可以請求用戶授權(quán)訪問其在運(yùn)動(dòng)追蹤服務(wù)提供商處的運(yùn)動(dòng)數(shù)據(jù),以便為用戶提供更全面的健身分析和建議。
- API 訪問:開發(fā)者在開發(fā)第三方應(yīng)用時(shí),需要調(diào)用某些服務(wù)提供商的 API 來獲取數(shù)據(jù)或執(zhí)行操作。通過 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):存儲受保護(hù)資源的服務(wù)器。它負(fù)責(zé)驗(yàn)證訪問令牌的有效性,并在驗(yàn)證通過后向第三方應(yīng)用提供相應(yīng)的資源。例如,F(xiàn)acebook 的服務(wù)器存儲了用戶的個(gè)人信息和照片,當(dāng)?shù)谌綉?yīng)用攜帶有效的訪問令牌請求這些資源時(shí),F(xiàn)acebook 的服務(wù)器會進(jìn)行驗(yàn)證并返回?cái)?shù)據(jù)。
- 客戶端(Client):即第三方應(yīng)用,希望訪問用戶的受保護(hù)資源??蛻舳诵枰全@得用戶的授權(quán),然后使用授權(quán)服務(wù)器頒發(fā)的訪問令牌來訪問資源服務(wù)器上的資源。例如,上述的第三方游戲應(yīng)用就是客戶端。
- 授權(quán)服務(wù)器(Authorization Server):負(fù)責(zé)驗(yàn)證資源所有者的身份,處理授權(quán)請求,并發(fā)放訪問令牌。它與資源所有者進(jìn)行交互,確認(rèn)用戶是否同意授權(quán)給客戶端,并在用戶授權(quán)后生成并返回訪問令牌。例如,F(xiàn)acebook 的授權(quán)服務(wù)器會驗(yàn)證用戶的身份,顯示授權(quán)頁面,當(dāng)用戶點(diǎn)擊“同意”后,生成訪問令牌并返回給客戶端。
授權(quán)流程
OAuth 2.0 定義了四種授權(quán)模式,下面詳細(xì)介紹最常用的授權(quán)碼模式(Authorization Code Grant):
- 客戶端請求授權(quán):客戶端引導(dǎo)用戶到授權(quán)服務(wù)器的授權(quán)端點(diǎn),請求用戶授權(quán)。請求中包含客戶端 ID、重定向 URI、請求的權(quán)限范圍等信息。例如,當(dāng)用戶在第三方游戲應(yīng)用中選擇使用 Facebook 賬號登錄時(shí),應(yīng)用會將用戶重定向到 Facebook 的授權(quán)頁面,并攜帶應(yīng)用的客戶端 ID、指定的重定向 URI 以及請求的權(quán)限范圍(如獲取用戶的基本信息、好友列表等)。
- 用戶授權(quán):用戶在授權(quán)服務(wù)器的頁面上登錄并確認(rèn)是否授權(quán)給客戶端訪問其資源。例如,用戶在 Facebook 的授權(quán)頁面上輸入自己的賬號密碼登錄后,會看到一個(gè)授權(quán)提示,顯示第三方應(yī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ù)器會將用戶重定向回第三方游戲應(yīng)用指定的重定向 URI,并在 URL 中附帶授權(quán)碼。
- 客戶端換取訪問令牌:客戶端使用接收到的授權(quán)碼向授權(quán)服務(wù)器的令牌端點(diǎn)發(fā)送請求,同時(shí)提供客戶端 ID 和客戶端密鑰進(jìn)行身份驗(yàn)證。授權(quán)服務(wù)器驗(yàn)證通過后,返回訪問令牌(Access Token)和可選的刷新令牌(Refresh Token)。例如,第三方游戲應(yīng)用接收到授權(quán)碼后,會向 Facebook 的令牌端點(diǎn)發(fā)送請求,攜帶授權(quán)碼、客戶端 ID 和客戶端密鑰,F(xiàn)acebook 的授權(quán)服務(wù)器驗(yàn)證這些信息無誤后,會返回訪問令牌和可能的刷新令牌。
- 客戶端訪問資源:客戶端使用訪問令牌向資源服務(wù)器發(fā)送請求,資源服務(wù)器驗(yàn)證令牌的有效性,驗(yàn)證通過后返回受保護(hù)的資源。例如,第三方游戲應(yīng)用使用接收到的訪問令牌向 Facebook 的資源服務(wù)器請求用戶的基本信息,資源服務(wù)器驗(yàn)證令牌有效后,會返回用戶的姓名、頭像等信息。
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è)配置類來配置 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è)簡單的控制器來測試 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 類:對 Spring Security 進(jìn)行配置,要求所有請求都需經(jīng)過身份驗(yàn)證,并啟用 OAuth 2.0 登錄。
- HomeController 類:提供一個(gè)簡單的端點(diǎn)
/
,只有經(jīng)過身份驗(yàn)證的用戶才能訪問。 - 主應(yīng)用類:啟動(dòng) Spring Boot 應(yīng)用。
按照上述步驟操作,就能在 Spring Boot 項(xiàng)目中集成 OAuth 2.0 認(rèn)證。啟動(dòng)應(yīng)用后,訪問項(xiàng)目根路徑,會自動(dòng)跳轉(zhuǎn)到 GitHub 的授權(quán)頁面,授權(quán)成功后即可訪問受保護(hù)的資源。
到此這篇關(guān)于SpringBoot集成OAuth2.0的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)SpringBoot OAuth2.0內(nèi)容請搜索腳本之家以前的文章或繼續(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)文章
Java實(shí)現(xiàn)高效批量讀取Redis數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了如何使用Java實(shí)現(xiàn)高效批量讀取Redis數(shù)據(jù)功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-06-06cookie+mybatis+servlet實(shí)現(xiàn)免登錄時(shí)長兩天半的整體流程
這篇文章主要介紹了cookie+mybatis+servlet實(shí)現(xiàn)免登錄時(shí)長兩天半,主要用到的技術(shù)有session、cookie、轉(zhuǎn)發(fā)、重定向、filter、和servlet,最重要的還是具體的來運(yùn)用它們在前端頁面真正的搭建出一個(gè)應(yīng)用,通過這個(gè)練習(xí),對我們所學(xué)的web知識做一個(gè)整合,需要的朋友可以參考下2022-10-10springboot攔截器不攔截靜態(tài)資源,只攔截controller的實(shí)現(xiàn)方法
這篇文章主要介紹了springboot攔截器不攔截靜態(tài)資源,只攔截controller的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07關(guān)于Java中修飾符的總結(jié)(fina除外)
下面小編就為大家?guī)硪黄P(guān)于Java中修飾符的總結(jié)(fina除外)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-09-09SpringBoot錯(cuò)誤提示400狀態(tài)問題
這篇文章主要介紹了SpringBoot錯(cuò)誤提示400狀態(tài)問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08Springboot發(fā)送郵件功能的實(shí)現(xiàn)詳解
電子郵件是—種用電子手段提供信息交換的通信方式,是互聯(lián)網(wǎng)應(yīng)用最廣的服務(wù)。本文詳細(xì)為大家介紹了SpringBoot實(shí)現(xiàn)發(fā)送電子郵件功能的示例代碼,需要的可以參考一下2022-09-09