Github的OAuth2登录

news2024/11/14 11:04:20

在 Spring Boot 3.3.5 中使用 Spring Security 接入 GitHub 社区登录的过程大致与之前的版本相似,但需要根据 Spring Boot 3.x 的新特性稍作调整。以下是具体步骤:

1. 在 GitHub 上创建 OAuth 应用

  1. 登录 GitHub Developer Settings。
  2. OAuth Apps 中点击 New OAuth App
  3. 填写应用信息:
    • Application name:应用名称。
    • Homepage URL:应用主页地址。
    • Authorization callback URL:通常为 http://localhost:8080/login/oauth2/code/github
  4. 创建完成后,记录下 Client IDClient Secret,稍后在 Spring Security 中使用。

2. 配置 Spring Security OAuth2 Client

.xml 配置
 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-oauth2-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.thymeleaf.extras</groupId>
            <artifactId>thymeleaf-extras-springsecurity6</artifactId>
        </dependency>

在 Spring Boot 3.3.5 中,你可以在 application.ymlapplication.properties 文件中配置 GitHub 的 OAuth Client 信息。

application.yml 中配置
spring:
  security:
    oauth2:
      client:
        registration:
          github:
            client-id: YOUR_CLIENT_ID
            client-secret: YOUR_CLIENT_SECRET
            scope: read:user, user:email
            redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
            authorization-grant-type: authorization_code
            # client-authentication-method: basic            
            client-authentication-method: client_secret_basic

        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

替换 YOUR_CLIENT_IDYOUR_CLIENT_SECRET 为 GitHub 中生成的 Client IDClient Secret

3. 配置 Spring Security

在 Spring Boot 3 中,Spring Security 的默认配置会自动适配 OAuth2 登录,但你仍然可以自定义配置。

自定义 Security 配置类

通过 SecurityFilterChain 配置自定义的安全规则和 OAuth2 登录参数。

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
            .authorizeHttpRequests(authorize -> authorize
                .requestMatchers("/", "/login").permitAll()  // 配置访问权限
                .anyRequest().authenticated()  // 其他请求需要认证
            )
            .oauth2Login(oauth2 -> oauth2
                .loginPage("/login")  // 自定义登录页面
                .defaultSuccessUrl("/home")  // 登录成功后的页面
                .failureUrl("/login?error=true")  // 登录失败跳转页面
            );
           http.logout(logout -> logout
                .logoutUrl("/logout")  // 指定注销路径
                .logoutSuccessUrl("/")  // 注销后跳转到主页
                .invalidateHttpSession(true)
                .clearAuthentication(true)
                .permitAll()  // 允许所有用户访问 /logout
        );
//        http.logout(logout -> logout.logoutSuccessUrl("/"));;
        return http.build();
    }
}

4. 创建控制器和视图

控制器类

定义一个简单的控制器,用于处理主页、登录页和成功登录后的主页。

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HomeController {

    @GetMapping("/")
    public String index() {
        return "index";  // 首页
    }

    @GetMapping("/login")
    public String login() {
        return "login";  // 登录页
    }

    @GetMapping("/home")
    public String home() {
        return "home";  // 登录成功后的页面
    }
}
视图文件

src/main/resources/templates 目录下创建以下 Thymeleaf 文件。

  • index.html:主页内容
  • login.html:自定义登录页面
  • home.html:登录成功后的页面

index.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Welcome</title>
</head>
<body>
    <h1>Welcome to the GitHub Login Demo</h1>
    <a href="/oauth2/authorization/github">Login with GitHub</a>
</body>
</html>

login.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Login</title>
</head>
<body>
    <h1>Login</h1>
    <a href="/oauth2/authorization/github">Login with GitHub</a>
</body>
</html>

home.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Home</title>
</head>
<body>
<h1>Welcome, <span th:text="${name}">User</span>!</h1>
<p>GitHub Username: <span th:text="${login}"></span></p>
<p>Email: <span th:text="${email}">N/A</span></p>
<div>
    <img th:src="${avatar_url}" alt="GitHub Avatar" width="100" height="100" />
</div>
<form th:action="@{/logout}" method="post">
    <button type="submit">Logout</button>
</form>
<!--<a th:href="@{/logout}">Logout</a>-->

</body>
</html>

5. 测试 GitHub 登录

  1. 运行 Spring Boot 应用。
  2. 访问 http://localhost:8080,点击 Login with GitHub,会跳转到 GitHub 登录页面。
  3. 使用 GitHub 账号登录授权后,应用会跳转到 /home 页面,显示登录成功的信息。

6. 自定义用户信息处理(可选)

如需自定义 GitHub 返回的用户信息,可以实现 OAuth2UserService<OAuth2UserRequest, OAuth2User> 接口,解析 GitHub 返回的用户数据。

自定义 OAuth2UserService 实现
import org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserService;
import org.springframework.security.oauth2.client.userinfo.OAuth2UserRequest;
import org.springframework.security.oauth2.core.OAuth2AuthenticationException;
import org.springframework.security.oauth2.core.user.DefaultOAuth2User;
import org.springframework.security.oauth2.core.user.OAuth2User;
import org.springframework.stereotype.Service;

import java.util.Map;

@Service
public class CustomOAuth2UserService extends DefaultOAuth2UserService {

    @Override
    public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {
        OAuth2User user = super.loadUser(userRequest);
        // 提取并处理用户信息
        Map<String, Object> attributes = user.getAttributes();
        return new DefaultOAuth2User(user.getAuthorities(), attributes, "id"); // GitHub 用 'id' 作为用户名属性
    }
}

在 上面SecurityConfig 中注入自定义的 OAuth2UserService

在 Spring Boot 3.3.5 中使用 Spring Security 接入 GitHub 社区登录并不复杂,主要依赖 OAuth2 协议完成 GitHub 的授权认证,通过简单的配置文件和安全配置即可实现。


GitHub 的 OAuth2 登录流程

在 Spring Boot 中集成 GitHub 的 OAuth2 登录时,大部分认证流程确实由 Spring Security 底层自动处理,开发者无需显式处理具体的认证和令牌交换逻辑。以下是每个配置项的具体作用以及 Spring Security 的处理方式:

在 Spring Security 集成 GitHub 的 OAuth2 登录流程中,这些接口和 URI 之间有以下关系:

1. http://localhost:8080/oauth2/authorization/github

  • 作用:这是应用的登录入口 URL,Spring Security 使用这个 URL 来启动 OAuth2 授权流程。
  • 触发方式:当用户访问此 URL 时,Spring Security 会将用户重定向到 GitHub 的授权页面,即 authorization-uri
  • 映射的配置:这个 URL 由 OAuth2LoginConfigurer 生成,自动映射到配置的 authorization-uri,即 https://github.com/login/oauth/authorize

2. authorization-uri: https://github.com/login/oauth/authorize

  • 作用:这是 GitHub 的授权端点,用于请求用户授权访问。
  • 触发方式:当用户通过 http://localhost:8080/oauth2/authorization/github 启动登录流程时,Spring Security 会自动重定向到此 URL,向 GitHub 请求用户授权。
  • 流程:Spring Security 在构建授权请求时会将 client_idredirect_uri(即 {baseUrl}/login/oauth2/code/{registrationId})以及 scope 等参数添加到此 URL,GitHub 授权完成后会重定向回应用。

3. redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"

  • 作用:这是授权完成后的回调地址(GitHub 授权页面完成授权后会重定向至此 URL)。
  • URL 示例:对于 GitHub 的登录流程,该 URL 实际会被解析为 http://localhost:8080/login/oauth2/code/github,其中 {registrationId}github
  • 流程:GitHub 在授权成功后,会附带 codestate 参数重定向到此 URL。Spring Security 在此处理回调请求,并使用 code 向 GitHub 的 token-uri 请求访问令牌。

4. token-uri: https://github.com/login/oauth/access_token

  • 作用:这是 GitHub 的令牌端点,用于交换访问令牌。
  • 流程:Spring Security 在收到 GitHub 回调请求后,会使用授权代码 codetoken-uri 发送请求以获取访问令牌。
  • 实现:Spring Security 自动处理令牌请求和响应,无需额外配置或代码。

5. user-info-uri: https://api.github.com/user

  • 作用:这是 GitHub 的用户信息端点,用于获取已授权用户的基本信息。
  • 流程:Spring Security 在成功获取访问令牌后,会自动向 user-info-uri 发送请求,获取用户的详细信息(如用户名、电子邮件、头像等)。
  • 应用:从 user-info-uri 获取的数据会自动映射到 OAuth2User 对象中,供应用使用,例如在控制器中通过 @AuthenticationPrincipal OAuth2User 注解获取。

整体流程总结

  1. 用户点击登录:访问 http://localhost:8080/oauth2/authorization/github,触发 OAuth2 登录流程。
  2. 重定向到 GitHub 授权页面:Spring Security 将用户重定向到 authorization-urihttps://github.com/login/oauth/authorize),用户在 GitHub 授权。
  3. GitHub 回调:授权完成后,GitHub 重定向到应用的 redirect-uri(例如 http://localhost:8080/login/oauth2/code/github),附带授权 code
  4. 获取访问令牌:Spring Security 使用 code 请求 token-urihttps://github.com/login/oauth/access_token)来交换访问令牌。
  5. 获取用户信息:在成功获取令牌后,Spring Security 使用 user-info-urihttps://api.github.com/user)获取用户信息,并将信息映射到 OAuth2User 对象中。
  6. 完成登录:用户被重定向到应用的主页或配置的默认成功页面。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2238737.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人工智能、机器学习与深度学习:层层递进的技术解读

引言 在当今科技快速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;已经成为一个热门话题&#xff0c;几乎渗透到了我们生活的方方面面。从智能手机的语音助手&#xff0c;到自动驾驶汽车&#xff0c;再到医疗诊断中的图像识别&#xff0c;人工智能的应用正在改变我…

光流法(Optical Flow)

一、简介 光流法&#xff08;Optical Flow&#xff09;是一种用于检测图像序列中像素运动的计算机视觉技术。其基于以下假设&#xff1a; 1.亮度恒定性假设&#xff1a;物体在运动过程中&#xff0c;其像素值在不同帧中保持不变。 2.空间和时间上的连续性&#xff1a;相邻像素之…

OkHttp网络请求框架

添加依赖 在 build.gradle 文件中添加 OkHttp 依赖&#xff1a; dependencies {implementation("com.squareup.okhttp3:okhttp:4.10.0") }使用OkHttp发起GET请求 同步请求 public class MainActivity extends AppCompatActivity {// Used to load the okhttptes…

《XGBoost算法的原理推导》12-14决策树复杂度的正则化项 公式解析

本文是将文章《XGBoost算法的原理推导》中的公式单独拿出来做一个详细的解析&#xff0c;便于初学者更好的理解。 我们定义一颗树的复杂度 Ω Ω Ω&#xff0c;它由两部分组成&#xff1a; 叶子结点的数量&#xff1b;叶子结点权重向量的 L 2 L2 L2范数&#xff1b; 公式(…

使用postmain 测试下载文件接口

文章目录 前言使用postmain 测试下载文件接口 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的话&#xff0c;那欢迎常来啊!!…

Python函数详解

目录 一、函数的定义 二、函数的特性 三、函数参数 四、返回值 五、文档字符串 六、高级函数 七、偏函数 八、装饰器 总结 在Python编程中&#xff0c;函数是构建程序的基本模块&#xff0c;它提供了一种封装特定任务的方式&#xff0c;使得代码更加模块化、可重用和易…

【贪心算法】贪心算法三

贪心算法三 1.买卖股票的最佳时机2.买卖股票的最佳时机 II3.K 次取反后最大化的数组和4.按身高排序5.优势洗牌&#xff08;田忌赛马&#xff09; 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#…

【Android、IOS、Flutter、鸿蒙、ReactNative 】文本点击事件

Android Studio 版本 Android Java TextView 实现 点击事件 参考 import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.TextView; import android.widget.Toast;public c…

超30万亿消费规模下,低龄VS高龄、他VS她、共性VS个性的市场机会

作者 | NewAgingPro团队 前言 NewAgingPro团队基于多年研究沉淀&#xff0c;发现每个行业都具备为老年人群再次细分的机会&#xff0c;中国的银发经济市场将围绕老年人需求不断往细分场景垂直深耕。具体哪些需求是市场增长的源动力&#xff1f;40岁泛银发群体的需求趋势如何…

贪心算法-汽车加油

这道题目描述了一个汽车旅行场景&#xff0c;需要设计一个有效的算法来决定在哪几个加油站停车加油&#xff0c;以便最小化加油次数。题目给出了汽车加满油后的行驶距离n公里&#xff0c;以及沿途若干个加油站的位置。我们需要找出一个方案&#xff0c;使得汽车能够完成整个旅程…

【动手学电机驱动】STM32-FOC(6)基于 IHM03 的无感方波控制

STM32-FOC&#xff08;1&#xff09;STM32 电机控制的软件开发环境 STM32-FOC&#xff08;2&#xff09;STM32 导入和创建项目 STM32-FOC&#xff08;3&#xff09;STM32 三路互补 PWM 输出 STM32-FOC&#xff08;4&#xff09;IHM03 电机控制套件介绍 STM32-FOC&#xff08;5&…

CNN实现地铁短时客流预测

项目源码获取方式见文章末尾&#xff01; 600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【基于CNN-RNN的影像报告生成】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实现…

SDL打开YUV视频

文章目录 问题1&#xff1a;如何控制帧率&#xff1f;问题2&#xff1a;如何触发退出事件&#xff1f;问题3&#xff1a;如何实时调整视频窗口的大小问题4&#xff1a;YUV如何一次读取一帧的数据&#xff1f; 问题1&#xff1a;如何控制帧率&#xff1f; 单独用一个子线程给主线…

Linux 系统结构

Linux系统一般有4个主要部分&#xff1a;内核、shell、文件系统和应用程序。内核、shell和文件系统一起形成了基本的操作系统结构&#xff0c;它们使得用户可以运行程序、管理文件并使用系统。 1. linux内核 内核是操作系统的核心&#xff0c;具有很多最基本功能&#xff0c;它…

使用vscode 连接linux进行开发

1. 在Vscode中安装扩展功能remote ssh 2. 打开命令窗口 3. 在弹出的命令窗口输入ssh&#xff0c;并从弹出的提示中选择 Add New SSH Host 4. 在弹出的输入窗口中输入类似下面形式的 连接地址&#xff1a; 5. 输入回车后出现下面的对话框&#xff0c;这个对话框是说你要用哪个…

【C++】 C++游戏设计---五子棋小游戏

1. 游戏介绍 一个简单的 C 五子棋小游戏 1.1 游戏规则&#xff1a; 双人轮流输入下入点坐标横竖撇捺先成五子连线者胜同一坐标点不允许重复输入 1.2 初始化与游戏界面 初始化界面 X 输入坐标后 O 输入坐标后 X 先达到胜出条件 2. 源代码 #include <iostream> #i…

计算机新手练级攻略——如何搜索问题

目录 计算机学生新手练级攻略——如何搜索问题1.明确搜索意图2.使用精确关键词3.使用专业引擎搜索4.利用好技术社区1. Stack Overflow2. GitHub3. IEEE Xplore4. DBLP 5.使用代码搜索工具1. GitHub 代码搜索2. Stack Overflow 代码搜索3. Papers with Code4. IEEE Xplore 6.查阅…

【MySQL】MySQL基础知识复习(下)

前言 上一篇博客介绍了MySQL的库操作&#xff0c;表操作以及CRUD。 【MySQL】MySQL基础知识复习&#xff08;上&#xff09;-CSDN博客 本篇将进一步介绍CRUD操作&#xff0c;尤其是查找操作 目录 一.数据库约束 1.约束类型 1.1NULL约束 1.2UNIQUE&#xff1a;唯一约束 …

从0开始学docker (每日更新 24-11-6)

限制容器运行的资源 限制容器的内存使用 容器的内存包括两部分&#xff1a;物理内存和交换空间&#xff08;swap&#xff09; 用户内存限制 -m,--memory&#xff1a;容器可用的最大内存&#xff0c;该值最低为4MB --memory-swap&#xff1a;允许容器置入磁盘交换空间的内存…

C++初阶——vector

一、什么是vector vector是表示可变大小的数组的序列容器&#xff0c;就像数组一样&#xff0c;vector也采用连续空间来存储元素。也就是说它的访问和数组一样高效&#xff0c;但是它的大小是动态可变的&#xff0c;并且它的大小会被容器自动处理。 二、vector的构造 常用的构…