Spring Boot整合OAuth2实现GitHub第三方登录

news2024/9/20 20:21:07

Spring Boot整合OAuth2,实现GitHub第三方登录


1、第三方登录原理

第三方登录的原理是借助OAuth授权来实现,首先用户先向客户端提供第三方网站的数据证明自己的身份获取授权码,然后客户端拿着授权码与授权服务器建立连接获得一个Access Token,之后客户端就可以通过Access Token来与资源服务器进行交互。

使用OAuth的好处是提供给用户一个特定的密钥,用户持有这个密钥可以访问应用中的任何信息,而不需要向网站提供用户名&密码,可以实现跨系统共享用户授权协议。

通过控制用户持有的密钥,可以很方便的控制用户可以访问的资源,以及控制密钥的过期时间。

以下是来自维基百科对于OAuth的介绍

开放授权(OAuth)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。

OAuth允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据。每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅是某一相册中的视频)。这样,OAuth让用户可以授权第三方网站访问他们存储在另外服务提供者的某些特定信息,而非所有内容。

OAuth是OpenID的一个补充,但是完全不同的服务。

交互流程如下:

2、GitHub实现第三方登录

首先需要在github中对应用进行登记,让Github知道谁在发送请求。

访问这个网址,填写登记表

提交成功之后,GitHub会返回Client ID & Client Secrets ,这是应用的身份识别码

创建一个SpringBoot工程,pom.xml文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.17</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>org.pp</groupId>
    <artifactId>springboot-oauth2-api</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-oauth2-api</name>
    <description>springboot整合oauth2,实现GitHub第三方登录</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
   
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

将ID和密钥添加到配置文件application.yml中:

# 项目端口号
server:
  port: 8080
#  GitHub认证相关参数
github:
    client:
      id: xxx
      secret: xxx

创建一个实体类,用于映射授权成功产生的Token令牌:

import com.fasterxml.jackson.annotation.JsonProperty;
/**
 *
 * Token令牌 - 响应参数
 *
 * @author supanpan
 * @date 2023/10/25
 */
public class AccessTokenResponse {

    @JsonProperty("access_token")
    private String accessToken;

    public String getAccessToken() {
        return accessToken;
    }

    public void setAccessToken(String accessToken) {
        this.accessToken = accessToken;
    }
}

OAuthController如下:

**
 * @author supanpan
 * @date 2023/10/25
 */
@Controller
public class OAuthController {

    @Value("${github.client.id}")
    private String clientId;

    @Value("${github.client.secret}")
    private String clientSecret;

    @GetMapping("/oauth/redirect")
    public String handleRedirect(@RequestParam("code") String requestToken, Model model) {
        // 使用RestTemplate来发送HTTP请求
        RestTemplate restTemplate = new RestTemplate();

        // 获取Token的Url
        String tokenUrl = "https://github.com/login/oauth/access_token" +
                "?client_id=" + clientId +
                "&client_secret=" + clientSecret +
                "&code=" + requestToken;

        // 使用restTemplate向GitHub发送请求,获取Token
        AccessTokenResponse tokenResponse = restTemplate.postForObject(tokenUrl, null, AccessTokenResponse.class);

        // 从响应体中获取Token数据
        String accessToken = tokenResponse.getAccessToken();

        // 携带Token向GitHub发送请求
        String apiUrl = "https://api.github.com/user";
        HttpHeaders headers = new HttpHeaders();
        headers.set("Authorization", "token " + accessToken);
        HttpEntity<String> entity = new HttpEntity<>("parameters", headers);
        ResponseEntity<String> response = restTemplate.exchange(apiUrl, HttpMethod.GET, entity, String.class);
        model.addAttribute("userData", response.getBody());

        return "welcome";
    }
}

SpringBoot启动器

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringbootOauth2ApiApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootOauth2ApiApplication.class, args);
    }

}

还需要编写两个html页面,index.html和welcome.html

index.html

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>OAuth2 Demo</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
</head>

<body>
<a id="login">Login with GitHub</a>

<script>
    const client_id = 'xxxx';

    const authorize_uri = 'https://github.com/login/oauth/authorize';
    const redirect_uri = 'http://localhost:8080/oauth/redirect';

    const link = document.getElementById('login');
    link.href = `${authorize_uri}?client_id=${client_id}&redirect_uri=${redirect_uri}`;
</script>

</body>

</html>

welcome.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Hello</title>
</head>

<body>
    <h1>Welcome</h1>
    <div th:text="${userData}"></div>
</body>

</html>

启动项目,浏览器访问localhost:8080,会跳转到index页面,点击链接会跳转到GitHub应用授权页面

点击跳转到GitHub授权之后,GitHub会询问示例代码正在请求数据,您是否同意授权。

用户同意授权, GitHub 就会跳转到redirect_uri指定的跳转网址,并且带上授权码,跳转回来的 URL 就是下面的样子

// code参数就是授权码
http://localhost:8080/oauth/redirect?code:4ea423f2ec1e04c6376a

如下是服务的响应数据:

access token: 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
{
  login: 'AtwoodPa',
  id: 110728122,
  node_id: 'U_kgDOBpmTug',
  avatar_url: 'https://avatars.githubusercontent.com/u/110728122?v=4',
  gravatar_id: '',
  url: 'https://api.github.com/users/AtwoodPa',
  html_url: 'https://github.com/AtwoodPa',
  followers_url: 'https://api.github.com/users/AtwoodPa/followers',
  following_url: 'https://api.github.com/users/AtwoodPa/following{/other_user}',
  gists_url: 'https://api.github.com/users/AtwoodPa/gists{/gist_id}',
  starred_url: 'https://api.github.com/users/AtwoodPa/starred{/owner}{/repo}',
  subscriptions_url: 'https://api.github.com/users/AtwoodPa/subscriptions',
  organizations_url: 'https://api.github.com/users/AtwoodPa/orgs',
  repos_url: 'https://api.github.com/users/AtwoodPa/repos',
  events_url: 'https://api.github.com/users/AtwoodPa/events{/privacy}',
  received_events_url: 'https://api.github.com/users/AtwoodPa/received_events',
  type: 'User',
  site_admin: false,
  name: null,
  company: null,
  blog: '',
  location: null,
  email: null,
  hireable: null,
  bio: null,
  twitter_username: null,
  public_repos: 6,
  public_gists: 0,
  followers: 0,
  following: 3,
  created_at: '2022-08-06T13:02:16Z',
  updated_at: '2023-09-03T00:15:55Z'
}
authorization code: 4ea423f2ec1e04c6376a

成功执行上述流程,最终展示示例的welcome页面

到这里,Spring Boot整合GitHub实现第三方登录的实现就结束了,以此类推其他厂商的第三方登录实现流程也大概是这样。

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

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

相关文章

【Note】链式存储结构

设计不同的结点结构&#xff0c;可以构成不同的链式存储结构。常用的有&#xff1a;二叉链表、三叉链表、线索链表&#xff08;用空链域存放指向前驱或后继的线索&#xff09;。 二叉链表存储 VS 一般二叉树 二叉链表 VS 二叉树 知识点&#xff1a; 一个二叉链表由根指针root…

2022年06月 Python(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试&#xff08;1~6级&#xff09;全部真题・点这里 一、单选题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 第1题 在Python编辑器中写好程序代码后&#xff0c;在Run菜单中&#xff0c;下列哪个命令可以用来执行程序&#xff1f;&…

消费大变革时代,三只松鼠的“高端性价比”如何突围制胜?

在浙江1天连开37家社区零食店&#xff0c;三只松鼠正在苏醒。 “三只松鼠去年是重创&#xff0c;可以讲是壮士断腕。”三只松鼠&#xff08;300783.SZ&#xff09;创始人、CEO章燎原在9月底接受红星资本局专访时总结。 过去几年&#xff0c;章燎原几乎没有接受过媒体采访。而…

计算机基础知识39

外键 外键字段>>>:部门编号 其实就是用来标识表与表之间的数据关系 # 简单的理解为该字段可以让你去到其他表中查找数据 表与表之间的关系 # 一对多、多对多、一对一、没有关系 ### 一对多的表关系&#xff1a; 员工表&#xff1a;一个员工一个部门 x …

如何使用 Pinia ORM 管理 Vue 中的状态

状态管理是构建任何Web应用程序的重要组成部分。虽然Vue提供了管理简单状态的技术&#xff0c;但随着应用程序复杂性的增加&#xff0c;处理状态可能变得更具挑战性。这就是为什么像Pinia这样的库被创建出来&#xff0c;以增强Vue的基本状态管理能力。然而&#xff0c;在大型应…

uni-app中tab选项卡的实现效果 @click=“clickTab(‘sell‘)“事件可传参数

一、效果图 二、代码 <template><view><view class"choose-tab"><view class"choose-tab-item" :class"chooseTab 0 ? active : " data-choose"0" click"clickTab">选项1</view><view …

第三天:配置+运行代码+改个保存键

1.上午 11点前 1.拉取文件 刷新依赖库看代码改需求 2.上午11点后 解决问题如下2.1 2.2 看文档看代码 3.下午2点到6点 对接前端 看演示视频看代码把软件运行起来 4.一直报错 &#xff08;依赖环境装备配比&#xff09; 5.依赖文件一直报错&#xff08;一会好 一会错&…

项目团队管理的常见难点,如何有效解决?

在项目管理中&#xff0c;项目经理经常会遇到团队成员工作不积极、工作任务互相推诿、踢皮球以及习惯性甩锅等一系列的团队管理相关的问题&#xff1b;遭遇这几大常见问题后&#xff0c;项目推进就容易陷入僵局。在这种情况下&#xff0c;如何有效解决问题&#xff0c;提升工作…

Pytorch整体工作流程代码详解(新手入门)

一、前言 本文详细介绍Pytorch的基本工作流程及代码&#xff0c;以及如何在GPU上训练模型&#xff08;如下图所示&#xff09;包括数据准备、模型搭建、模型训练、评估及模型的保存和载入。 适用读者&#xff1a;有一定的Python和机器学习基础的深度学习/Pytorch初学者。 本文…

HDR和泛光

HDR 显示器被限制为只能显示值为0.0到1.0间的颜色&#xff0c;但是在光照方程中却没有这个限制。通过使片段的颜色超过1.0&#xff0c;我们有了一个更大的颜色范围&#xff0c;这也被称作HDR(High Dynamic Range, 高动态范围) 允许用更大范围的颜色值渲染从而获取大范围的黑暗…

APP盾的防御机制及应用场景

移动应用&#xff08;APP&#xff09;在我们日常生活中扮演着越来越重要的角色&#xff0c;但随之而来的是各种网络安全威胁的增加。为了保障APP的安全性&#xff0c;APP盾作为一种专门设计用于防御移动应用威胁的工具得以广泛应用。本文将深入探讨APP盾的防御机制以及在不同应…

计算机算法分析与设计(20)---回溯法(0-1背包问题)

文章目录 1. 题目描述2. 算法思路3. 例题分析4. 代码编写 1. 题目描述 对于给定的 n n n 个物品&#xff0c;第 i i i 个物品的重量为 W i W_i Wi​&#xff0c;价值为 V i V_i Vi​&#xff0c;对于一个最多能装重量 c c c 的背包&#xff0c;应该如何选择放入包中的物品…

命令行输入sns.countplot(data[‘marital‘])报错

代码sns.countplot(data[marital])是用于绘制柱状图来显示分类变量的频数分布。但是&#xff0c;根据警告信息&#xff0c;从Seaborn 0.12版本开始&#xff0c;只有一个有效的位置参数data&#xff0c;其他参数必须作为关键字参数传递。因此&#xff0c;你需要将参数data[marit…

【idea】使用教程:idea 打开项目、配置、项目打包详细教程

目录 一、配套软件安装 二、打开已有项目 三、配置 jdk 四、项目打包 五、服务器首次创建目录 &#xff08;1&#xff09;后端代码目录 &#xff08;2&#xff09;前端代码目录 &#xff08;3&#xff09; 打包后的代码包上传到服务器上 一、配套软件安装 【idea】wi…

current file is not included in a workspace moduleg 存在多个 main函数的 Go项目 无法成功导包

报错缘由 学习 hystria, 尝试自测案例,使用了 go get “github.com/afex/hystrix-go/hystrix” 进行导入包&#xff0c; 导入成功后&#xff0c;在代码里利用 import 导入&#xff0c;但遇到了以下报错 could not import github.com/afex/hystrix-go/hystrix (current file i…

WorkPlus打造安全专属的移动数字化航空母舰,助力企业全面掌控业务和生态

在快速发展的商业环境中&#xff0c;企业对于安全和全面掌控业务和生态的需求日益增长。WorkPlus作为一款安全专属的移动数字化航空母舰&#xff0c;为企业提供了独特的解决方案&#xff0c;助力企业全面掌控业务和生态&#xff0c;实现安全性和效率的最佳平衡。 WorkPlus提供…

游戏数据分析对于运营游戏平台的重要性

游戏数据分析对于运营游戏平台具有至关重要的意义&#xff0c;它可以提供深入的见解&#xff0c;帮助了解玩家行为、偏好和互动&#xff0c;从而优化游戏体验&#xff0c;提高玩家参与度和留存率。 首先&#xff0c;通过游戏数据分析&#xff0c;运营者可以了解玩家在游戏中的表…

山西电力市场日前价格预测【2023-10-26】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-10-26&#xff09;山西电力市场全天平均日前电价为343.86元/MWh。其中&#xff0c;最高日前电价为515.42元/MWh&#xff0c;预计出现在18: 15。最低日前电价为131.00元/MWh&#xff0c;预计…

centos7安装minio

MINIO官网地址&#xff1a;MinIO | 高性能分布式存储&#xff0c;私有云存储 可以在官网下在包 1.安装软件最好设置在 /usr/local路径下 cd /usr/local mkdir minio 2.在新创建的minio路径下执行 wget https://dl.minio.org.cn/server/minio/release/linux-amd64/minio 默…

废柴勇士(据说没有人能坚持37秒)

欢迎来到程序小院 废柴勇士 玩法&#xff1a;点击屏幕下方左右按键击杀怪物&#xff0c;怪物会在左右方向同时来袭&#xff0c;快速点击按钮进行击杀怪物&#xff0c;看您能够坚持多少秒&#xff0c; 据说还没有能够坚持37秒&#xff0c;快去击杀怪物挑战吧^^。开始游戏https:…