一文搞懂 Spring Boot 集成 OAuth2.0:从零实现第三方登录(附完整代码+避坑指南)

视频看了几百小时还迷糊?关注我,几分钟让你秒懂!(发点评论可以给博主加热度哦)

🌟 一、需求场景:为什么我们要用 OAuth2.0?

想象一下这些场景:

  • 用户不想注册账号,只想用微信/支付宝/Google 快速登录你的网站;
  • 你的 App 需要调用 GitHub API 获取用户仓库信息;
  • 公司内部多个系统(如 HR 系统、OA 系统)希望统一登录,避免重复输入账号密码。

这些问题的通用解决方案就是 OAuth2.0 —— 一种安全、标准的授权框架。

⚠️ 注意:OAuth2.0 是「授权」协议,不是「认证」协议。但它常被用于实现“第三方登录”(如微信登录),此时结合了 OpenID Connect(OIDC)等扩展。

在 Spring Boot 中,我们可以通过 spring-boot-starter-oauth2-client 轻松集成主流平台(如 GitHub、Google、微信等)的 OAuth2 登录功能。


🧱 二、正例:Spring Boot + OAuth2.0 实现 GitHub 第三方登录

✅ 步骤 1:创建 Spring Boot 项目

依赖如下(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> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> </dependencies> 

✅ 步骤 2:配置 application.yml

spring: security: oauth2: client: registration: github: client-id: YOUR_GITHUB_CLIENT_ID client-secret: YOUR_GITHUB_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 user-name-attribute: id 
🔑 如何获取 client-idclient-secret?登录 GitHub Developer Settings创建新 OAuth App回调地址填:http://localhost:8080/login/oauth2/code/github

✅ 步骤 3:配置 Security 安全策略

@Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(authz -> authz .requestMatchers("/", "/login**").permitAll() .anyRequest().authenticated() ) .oauth2Login(oauth2 -> oauth2 .loginPage("/login") // 自定义登录页(可选) .defaultSuccessUrl("/profile", true) // 登录成功跳转 ); return http.build(); } } 

✅ 步骤 4:创建控制器和页面

@Controller public class HomeController { @GetMapping("/") public String home() { return "index"; } @GetMapping("/profile") public String profile(Model model, OAuth2AuthenticationToken authentication) { if (authentication != null) { Map<String, Object> attributes = authentication.getPrincipal().getAttributes(); model.addAttribute("name", attributes.get("name")); model.addAttribute("avatar", attributes.get("avatar_url")); } return "profile"; } } 

templates/index.html

<!DOCTYPE html> <html> <head><title>首页</title></head> <body> <h1>欢迎来到我的网站</h1> <a href="/oauth2/authorization/github">使用 GitHub 登录</a> </body> </html> 

templates/profile.html

<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head><title>个人资料</title></head> <body> <h1>你好,<span th:text="${name}">User</span>!</h1> <img th:src="${avatar}" /> <a href="/logout">退出登录</a> </body> </html> 

✅ 启动项目

访问 http://localhost:8080 → 点击“使用 GitHub 登录” → 跳转到 GitHub 授权页 → 授权后返回你的 /profile 页面,显示用户名和头像!


❌ 三、反例:常见错误写法(千万别这么干!)

反例 1:把 client-secret 写死在代码里

// ❌ 千万不要这样! @Bean public ClientRegistrationRepository clientRegistrationRepository() { ClientRegistration github = ClientRegistration.withRegistrationId("github") .clientId("your_real_id") .clientSecret("your_real_secret") // ← 泄露风险极高! .build(); return new InMemoryClientRegistrationRepository(github); } 
💡 正确做法:使用 application.yml + 环境变量或配置中心(如 Nacos、Apollo),生产环境绝不能明文写密钥!

反例 2:忽略 HTTPS(生产环境大忌)

OAuth2.0 的回调地址在 GitHub 等平台强制要求 HTTPS(本地 localhost 除外)。

如果你部署到公网却用 HTTP,会报错:

The redirect_uri MUST match the registered callback URL 
✅ 解决方案:部署时务必配 HTTPS,或使用 Ngrok / Cloudflare Tunnel 临时测试。

反例 3:未处理用户拒绝授权

用户点击“Cancel”后,GitHub 会重定向到你的回调地址并带上 error=access_denied

如果你没处理,可能报 500 错误。

✅ 建议:自定义失败处理器
.oauth2Login(oauth2 -> oauth2 .failureHandler((request, response, exception) -> { response.sendRedirect("/login?error=oauth_failed"); }) ) 

⚠️ 四、注意事项(小白必看!)

问题说明
OAuth2 ≠ JWTOAuth2 是授权框架,JWT 是令牌格式,二者常搭配但不等同
scope 权限最小化只申请必要权限(如 GitHub 用 read:user 而非 user
state 参数防 CSRFSpring Security 默认已启用,无需手动处理
用户信息字段不同GitHub 返回 idnameavatar_url;Google 返回 subemailpicture,注意 user-name-attribute 配置
多平台支持可同时配置 GitHub、Google、微信(需自定义 Provider)

📦 五、扩展:如何接入微信登录?

微信 OAuth2 不完全兼容标准(如 userinfo 返回 JSON 格式特殊),需自定义 CustomOAuth2UserService

但 GitHub/Google 等标准平台,Spring Boot 开箱即用!


✅ 总结

  • OAuth2.0 让用户安全地授权第三方访问资源;
  • Spring Boot 通过 oauth2-client 极简集成;
  • 配置 client-id/secret + Security 策略即可实现第三方登录;
  • 切记:密钥保密、HTTPS、错误处理、权限最小化。
视频看了几百小时还迷糊?关注我,几分钟让你秒懂!(发点评论可以给博主加热度哦)

Read more

蓝桥杯算法总结

蓝桥杯算法总结

序章 现处于大学生阶段,蓝桥杯算法竞赛算是我们的入门级竞赛,所以我们必须重视起来。 在这个算法总结中,我会用通俗易懂的语言,细致地讲述相关算法,希望能通过我的笔记,为大家带来一些帮助。 内容持续更新,坚持日更! 有任何想法可以在评论区提出,感谢观看。 递推和递归 递推 先简单介绍一下 递推算法:自底向上,由已知条件推导出位置结果的一种算法 核心:状态转移    边界+关系式 废话不多说,直接从题目入手理解递推思想 在这里选用信息学奥赛一本通的题:https://ybt.ssoier.cn/problem_show.php?pid=1314 题目意思理解: 从A点到B点的路径数,并且经过马能到达的点都无效,我们先做好前期的工作准备 //马走日,移动的位置(马能到达的点) int mx[] = {-1,-1,-2,-2,1,1,

By Ne0inhk
【算法通关】模拟:替换问号、提莫攻击、Z 字形变换、外观数列、数青蛙全解

【算法通关】模拟:替换问号、提莫攻击、Z 字形变换、外观数列、数青蛙全解

文章目录 * 1. 替换所有的问号 * 2. 提莫攻击 * 3. Z 字形变换 * 4. 外观数列 * 5. 数青蛙 1. 替换所有的问号 题目链接:1576. 替换所有的问号 题目描述: 算法思路: 从前向后遍历整个字符串,当遇到?时就从字母a 开始遍历 到z,找到与?前和后不重复的即可。 算法代码: publicStringmodifyString(String s){char[] chars = s.toCharArray();int n = chars.length;for(int i =0; i < n; i++){if(chars[i]=='

By Ne0inhk
从零开始学java--二叉树和哈希表

从零开始学java--二叉树和哈希表

数据结构基础 目录 数据结构基础 树 树形结构: 树的概念: 二叉树 概念: 两种特殊的二叉树: 二叉树的性质: 创建一个简单的二叉树: 二叉树的遍历 前序遍历: 中序遍历: 后序遍历: 层序遍历: 二叉查找树和平衡二叉树 二叉查找树: 平衡二叉树: 红黑树 哈希表 树 树形结构: 树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点: 1. 有一个特殊的结点,称为根结点,根结点没有前驱结点。 2. 除根结点外,其余结点被分成M(M > 0)个互不相交的集合T1、T2、......、Tm,其中每一个集合Ti (1 <= i

By Ne0inhk
机器学习之支持向量机(SVM)算法详解

机器学习之支持向量机(SVM)算法详解

文章目录 * 引言 * 一、 什么是支持向量机(SVM) * 二、 SVM的基本原理 * 三、数学推导 * 1.线性可分情况 * 2. 非线性可分情况 * 3. 核函数 * 四、SVM的优缺点 * 优点: * 缺点: * 五、 应用场景 * 六、 Python实现示例 * 七、 总结 引言 支持向量机(Support Vector Machine, SVM)是一种经典的监督学习算法,广泛应用于分类和回归问题。SVM以其强大的数学基础和优异的性能在机器学习领域占据重要地位。本文将详细介绍SVM的原理、数学推导、应用场景以及Python实现。 一、 什么是支持向量机(SVM) 支持向量机是一种二分类模型,其基本思想是找到一个超平面,将不同类别的数据分隔开,并且使得两类数据点到超平面的距离(即间隔)最大化。SVM不仅可以处理线性可分问题,还可以通过核函数处理非线性可分问题。 二、 SVM的基本原理

By Ne0inhk