JustAuth-第三方Oauth2登录方式

 更新时间:2024年09月18日 10:38:51   作者:勿语&  
JustAuth是一款支持多种第三方登录的工具,本文通过实战介绍了如何在Springboot项目中集成JustAuth实现第三方登录,主要步骤包括引入依赖、配置Controller、设置登录和回调页面,通过访问登录页面并选择Gitee登录,系统会重定向至Gitee进行认证

JustAuth-第三方Oauth2登录

JustAuth官网: https://www.justauth.cn/

JustAuth整合Springboot

1.引入依赖

<dependency>
	 <groupId>org.springframework.boot</groupId>
	 <artifactId>spring-boot-starter-web</artifactId>
	 <version>2.7.15</version>
</dependency>
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.26</version>
</dependency>
<dependency>
    <groupId>me.zhyd.oauth</groupId>
    <artifactId>JustAuth</artifactId>
    <version>1.16.6</version>
</dependency>

2.Controller

(到Gitee或GitHub上申请第三方授权,修改为自己的clientId、clientSecret)。

这里url中的 {source} 是为了接口和方法的复用。

@RestController
@RequestMapping("/oauth")
public class OauthController {

    @RequestMapping("/{source}")
    public void renderAuth(@PathVariable("source") String source,HttpServletResponse response) throws IOException {
        AuthRequest authRequest = getAuthRequest(source);
        response.sendRedirect(authRequest.authorize(AuthStateUtils.createState()));
    }

    @RequestMapping("/callback")
    public String login(@RequestParam("source") String source, AuthCallback callback) {
        AuthRequest authRequest = getAuthRequest(source);
        // 返回用户的基本信息
        AuthResponse authResponse = authRequest.login(callback);
        // 返回Token
        return UUID.randomUUID().toString();
    }

    private AuthRequest getAuthRequest(String source) {
        if ("gitee".equals(source)) {
            return new AuthGiteeRequest(AuthConfig.builder()
                    .clientId("***************************")
                    .clientSecret("****************************")
                    // 回调地址与Gitee上注册的保持一致
                    .redirectUri("http://127.0.0.1:8080/callback.html?source=gitee")
                    .build());
        }else if ("github".equals(source)){
            return new AuthGithubRequest(AuthConfig.builder()
                    .clientId("**********")
                    .clientSecret("*********")
                    // 回调地址与Github上注册的保持一致
                    .redirectUri("http://127.0.0.1:8080/callback.html?source=github")
                    .build());
        }
        return null;
    }
}

3.登陆页面 login.html

(放在resources/static/index.html)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<a href="http://localhost:8080/oauth/gitee" rel="external nofollow" >Gitee登录</a>
<a href="http://localhost:8080/oauth/github" rel="external nofollow" >Github登录</a>
</body>
</html>

4.回调页面 callback.html

(放在resources/static/callback.html)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>callback</title>
    <style>
        .overlay {
            position: fixed;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            background: rgba(0, 0, 0, 0.5);
            z-index: 9999;
            display: flex;
            justify-content: center;
            align-items: center;
        }

        .loader {
            font-size: 24px;
            color: white;
        }
    </style>
</head>
<body>
<div id="loading-overlay" class="overlay">
    <div class="loader">Loading</div>
</div>
<script>
    window.onload = async function () {
        showLoadingOverlay()
        // 获取 source、code、state参数发起fetch请求
        const params = new URLSearchParams(window.location.search);
        // 发起请求
        try {
            const res = await fetch("/oauth/callback", {
                method: "POST",
                headers: {
                    "Content-Type": "application/x-www-form-urlencoded",
                },
                body: params.toString(),
            }).then(res => res.text())
            localStorage.setItem("token", res)
            location.href = "/index.html"
        } finally {
            hideLoadingOverlay()
        }
    }

    // 显示遮罩
    function showLoadingOverlay() {
        document.getElementById("loading-overlay").style.display = "flex";
    }

    // 隐藏遮罩
    function hideLoadingOverlay() {
        document.getElementById("loading-overlay").style.display = "none";
    }
</script>
</body>
</html>

5.登录成功后跳转首页 index.html

(放在resources/static/index.html)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<div>首页</div>
</body>
</html>

启动项目访问 http://localhost:8080/login.html

点击Gitee登录 (会跳转到Gitee进行登录,登录成功后携带参数重定向到回调页面,如果Gitee已经登陆,则直接携带参数重定向到回调页面)。

callback.html 挂载后,会携带url参数,发起请求,请求结束之后保存返回的token,并跳转到index.html。

Gitee的回调URL:

http://127.0.0.1:8080/callback.html?source=gitee&code=19c26e280bc9a83de9df6c9698b802a61e210e4fce67b0867b8166eef990c053&state=f40f8a38c9dfed67ee912960016f8f69

index.html

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java的Character类详解

    Java的Character类详解

    在实际开发过程中,我们经常会遇到需要使用对象,而不是内置数据类型的情况。为了解决这个问题,Java语言为内置数据类型char提供了包装类Character类。本文详细介绍了Java的Character类,感兴趣的同学可以参考阅读
    2023-04-04
  • SpringBoot整合Shiro实现权限控制的代码实现

    SpringBoot整合Shiro实现权限控制的代码实现

    Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理,今天通过本文给大家介绍SpringBoot整合Shiro实现权限控制的方法,感兴趣的朋友一起看看吧
    2021-07-07
  • 一文搞懂MyBatis多数据源Starter实现

    一文搞懂MyBatis多数据源Starter实现

    本文将实现一个MyBatis的Springboot的Starter包,引用这个Starter包后,仅需要提供少量配置信息,就能够完成MyBatis多数据源的初始化和使用,需要的小伙伴可以参考一下
    2023-04-04
  • 解析Hibernate + MySQL中文乱码问题

    解析Hibernate + MySQL中文乱码问题

    如果持久化的类中有包括了汉字的String对象,那么对应到数据库中汉字的部分就会是乱码。这主要是由于MySQL数据表的字符集与我们当前使用的本地字符集不相同造成的
    2013-07-07
  • java线程之线程的生命周期的使用

    java线程之线程的生命周期的使用

    本篇文章介绍了,java线程之线程的生命周期的使用。需要的朋友参考下
    2013-05-05
  • Java Speech API实现语音识别

    Java Speech API实现语音识别

    Java语音识别是一项非常有用的功能,它可以将语音转换为文本,从而实现语音输入和语音控制功能,在当今数字化时代,语音识别技术逐渐成为人机交互的重要方式之一,语音识别技术可以帮助我们将语音数据转化为文字,进而进行后续的处理和分析
    2023-10-10
  • Java中双大括号初始化的理解与使用

    Java中双大括号初始化的理解与使用

    最近重读Java 编程思想,读到有关实例化代码块儿的内容,使我对于使用两个大括号进行初始化有了更深的理解,下面这篇文章主要给大家介绍了关于Java中双大括号初始化的理解与使用的相关资料,需要的朋友可以参考下
    2022-06-06
  • Java创建可执行的Jar文件的方法实践

    Java创建可执行的Jar文件的方法实践

    创建的可执行Jar文件实际就是在原始Jar的清单文件中添加了Main-Class的配置,本文主要介绍了Java创建可执行的Jar文件的方法实践,感兴趣的可以了解一下
    2023-12-12
  • Spring编程式和声明式事务实例讲解小结

    Spring编程式和声明式事务实例讲解小结

    这篇文章主要介绍了Spring编程式和声明式事务实例讲解小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • SpringBoot集成ShedLock实现分布式定时任务流程详解

    SpringBoot集成ShedLock实现分布式定时任务流程详解

    ShedLock是一个锁,官方解释是他永远只是一个锁,并非是一个分布式任务调度器。一般shedLock被使用的场景是,你有个任务,你只希望他在单个节点执行,而不希望他并行执行,而且这个任务是支持重复执行的
    2023-02-02

最新评论