当前位置: 首页 > article >正文

基于SpringBoot和OAuth2,实现通过Github授权登录应用

基于SpringBoot和OAuth2,实现通过Github授权登录应用

文章目录

  • 基于SpringBoot和OAuth2,实现通过Github授权登录应用
    • 0. 引言
    • 1. 创建Github应用
    • 2. 创建SpringBoot测试项目
      • 2.1 初始化项目
      • 2.2 设置配置文件信息
      • 2.3 创建Controller层
      • 2.4 创建Html页面
    • 3. 启动应用
    • 4. 其他

0. 引言

在注册登录网站或者应用时,通常会有社交方式登录,例如在登录CSDN时,会提供多种登陆方式,如下图。

在这里插入图片描述
本文介绍通过SpringBoot和OAuth2,开发自己的应用,并实现通过Github授权登录。

1. 创建Github应用

  • 首先登录Github,进入到Settings-Developer Settings,点击OAuth Apps,新建New OAuth App
    在这里插入图片描述
  • 填写相关信息
    在这里插入图片描述

点击注册应用

  • 注册完成后打开,可以获得Client IDClient secrets

注意!
Client secrets要注意复制下来保存,不然在进入这个页面,也获取不到原来完整的Client secrets了,只能重新生成!

在这里插入图片描述

2. 创建SpringBoot测试项目

2.1 初始化项目

初始化项目,同时应包含以下依赖

Spring Web
Thymeleaf
Spring Security
OAuth2 Client

在这里插入图片描述
创建完成后,创建Controller文件和index文件。最终项目结构目录如下:
在这里插入图片描述

2.2 设置配置文件信息

application.yml:

spring:
  security:
    oauth2:
      client:
        registration:
          github:
            client-id: xxx
            client-secret: xxx

将上面生成的client-id和client-secret写入配置文件

2.3 创建Controller层

IndexController.java

import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.oauth2.client.OAuth2AuthorizedClient;
import org.springframework.security.oauth2.client.annotation.RegisteredOAuth2AuthorizedClient;
import org.springframework.security.oauth2.core.user.OAuth2User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

/**
 * @author SaoE
 * @date 2024/12/29 21:29
 */
@Controller
public class IndexController {

    @GetMapping("/")
    public String index(
            Model model,
            @RegisteredOAuth2AuthorizedClient OAuth2AuthorizedClient authorizedClient,
            @AuthenticationPrincipal OAuth2User oauth2User) {
        model.addAttribute("userName", oauth2User.getName());
        model.addAttribute("clientName", authorizedClient.getClientRegistration().getClientName());
        model.addAttribute("userAttributes", oauth2User.getAttributes());
        return "index";
    }
}

2.4 创建Html页面

resources/templates/index.html

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="https://www.thymeleaf.org" xmlns:sec="https://www.thymeleaf.org/thymeleaf-extras-springsecurity5">
<head>
    <title>Spring Security - OAuth 2.0 Login</title>
    <meta charset="utf-8" />
</head>
<body>
<div style="float: right" th:fragment="logout" sec:authorize="isAuthenticated()">
    <div style="float:left">
        <span style="font-weight:bold">User: </span><span sec:authentication="name"></span>
    </div>
    <div style="float:none">&nbsp;</div>
    <div style="float:right">
        <form action="#" th:action="@{/logout}" method="post">
            <input type="submit" value="Logout" />
        </form>
    </div>
</div>
<h1>OAuth 2.0 Login with Spring Security</h1>
<div>
    You are successfully logged in <span style="font-weight:bold" th:text="${userName}"></span>
    via the OAuth 2.0 Client <span style="font-weight:bold" th:text="${clientName}"></span>
</div>
<div>&nbsp;</div>
<div>
    <span style="font-weight:bold">User Attributes:</span>
    <ul>
        <li th:each="userAttribute : ${userAttributes}">
            <span style="font-weight:bold" th:text="${userAttribute.key}"></span>: <span th:text="${userAttribute.value}"></span>
        </li>
    </ul>
</div>
</body>
</html>

3. 启动应用

  • 在浏览器输入并访问http://localhost:8080/,此时浏览器将被重定向到默认的自动生成的登录页面,该页面显示了一个用于GitHub登录的链接。
    在这里插入图片描述

点击授权

  • 此时,OAuth客户端访问GitHub的获取用户信息的接口获取基本个人资料信息,并建立一个已认证的会话。
    在这里插入图片描述

4. 其他

SpringBoot源码的CommonOAuth2Provider类中,默认配置了GOOGLEFACEBOOKGITHUBOKTA的授权登录配置
在这里插入图片描述
以Github为例,默认配置如下:

    GITHUB {
        public Builder getBuilder(String registrationId) {
            Builder builder = this.getBuilder(registrationId, ClientAuthenticationMethod.CLIENT_SECRET_BASIC, "{baseUrl}/{action}/oauth2/code/{registrationId}");
            builder.scope(new String[]{"read:user"});
            builder.authorizationUri("https://github.com/login/oauth/authorize");
            builder.tokenUri("https://github.com/login/oauth/access_token");
            builder.userInfoUri("https://api.github.com/user");
            builder.userNameAttributeName("id");
            builder.clientName("GitHub");
            return builder;
        }
    },

http://www.kler.cn/a/464114.html

相关文章:

  • Linux 内核中的 Netlink 机制:内核与用户空间的通信桥梁
  • Excel VBA 自动填充空白并合并相同值的解决方案
  • 用uniapp写一个播放视频首页页面代码
  • 数据挖掘——聚类
  • 2024年12月 Scratch 图形化(二级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • arcgis模版空库怎么用(一)
  • wx014基于springboot+vue+uniapp的智能小程序商城
  • 六年之约day5
  • python脚本,读取当前目录文件名,写入excel表格,并给对应文件名分配mac
  • 动态规划模式
  • 精密制造动力箱行业需要哪种多功能电表
  • 地理数据库Telepg面试内容整理-相关技术与工具
  • 【C语言】如何插入并播放音频文件
  • 高级架构五 设计模式
  • python中序列化之json文件的使用
  • Redis 发布订阅(Pub/Sub)机制详解
  • Switch组件的用法
  • 《我在技术交流群算命》(二):QGraphicsItem怎么写自定义信号啊(QObject多继承顺序问题)
  • 深入解析 JVM vs JDK vs JRE:三者区别与联系详解
  • python opencv的orb特征检测(Oriented FAST and Rotated BRIEF)
  • LevelDB 源码阅读:利用 Clang 的静态线程安全分析
  • 彻底解决 Selenium ChromeDriver 不匹配问题:Selenium ChromeDriver 最新版本下载安装教程
  • 概率论与数理统计
  • 需求上线,为什么要刷缓存?
  • LeetCode算法题——长度最小的子数组
  • 大模型的prompt的应用一