SpringBoot第三方登录JustAuth

JustAuth流程

  1. 创建授权请求,并跳转到授权页面,以便用户进行认证和授权
  2. 生成一个随机的 stateId,用于标识本次授权请求
  3. 封装到 Map 中作为响应返回给客户端
  4. 处理授权成功后回调的请求
  5. 调用 AuthRequest 的 login() 方法完成授权
  6. AuthResponse 对象封装到 ResponseResult 中返回给客户端

配置第三方应用

我们以gitee为例子,在个人设置中找到第三方应用。

创建应用

填写申请第三方应用

获取这两个关键密文

引入依赖

java 复制代码
<dependency>
	<groupId>me.zhyd.oauth</groupId>
	<artifactId>JustAuth</artifactId>
	<version>1.16.5</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

配置properties文件

java 复制代码
spring.thymeleaf.cache=false
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
gitee.ClientID=139dd95598cb6539e2e79edfdc67f29acf8ea52bbaa2f45c204efdb0d9bc0e24
gitee.ClientSecret=f0158ab4d918dd2f9b8d2c427bed5ecfbb1c1ddf8941c519108ce33a17fc3bd9

封装结果类

java 复制代码
import java.io.Serializable;
@Data
public class ResponseResult<T> implements Serializable {
    private Boolean success;
    private Integer code;
    private String msg;
    private T data;

    public static ResponseResult ok(Object data) {
        ResponseResult result = new ResponseResult();
        result.setData(data);
        return result;
    }

}

login页面

通过这个login-controller跳转到login页面

复制代码
@Controller
@RequestMapping("/login")
public class LoginController {
    @RequestMapping("/home")
    public String login(Model model){
        return "login";
    }
}

在这个页面点击gitee登录可以返回后端接口,后端接口再跳转gitee授权页面,返回数据给前端

复制代码
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript" src="/js/jquery-3.5.1.min.js"></script>
</head>
<body>
    <button id="bg">使用gitee登录</button>
</body>
<script type="text/javascript">
    $(function(){
        $("#bg").click(function(){
            $.get("/login-before",function(data,status){
               window.location=data.data.authorizePageUrl;
            });
        });
    });
</script>
</html>

Oauth2controller

后端完成获取授权码,发送授权码获取用户基本信息等操作

java 复制代码
import com.example.demo.util.ResponseResult;
import me.zhyd.oauth.config.AuthConfig;
import me.zhyd.oauth.model.AuthCallback;
import me.zhyd.oauth.model.AuthResponse;
import me.zhyd.oauth.request.AuthGiteeRequest;
import me.zhyd.oauth.request.AuthRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

@RestController
public class Oauth2Controller {

    @Value("${gitee.ClientID}")
    private String clientID;
    @Value("${gitee.ClientSecret}")
    private String clientSecret;

    private static final Logger LOG = LoggerFactory.getLogger(Oauth2Controller.class);
    @GetMapping("/login-before")
    public ResponseResult loginBeforByGitee(){
        // 创建授权request
        AuthRequest authRequest = getAuthRequest();
        String stateId = UUID.randomUUID().toString();
        LOG.info("stateId = " + stateId);
        // 跳转到授权页面
        String authorizePageUrl = authRequest.authorize(stateId);
        LOG.info("authorizePageUrl地址为"+authorizePageUrl);
        Map map = new HashMap<>();
        map.put("authorizePageUrl",authorizePageUrl);
        return ResponseResult.ok(map);
    }
    @GetMapping("/callback")
    public ResponseResult callback(String code,String state) {
        // gitee授权通过跳转到回调接口
        LOG.info("code = " + code);
        LOG.info("state = " + state);
        // 使用这个code去获取用户基本信息
        AuthResponse login = getAuthRequest().login(AuthCallback.builder().state(state).code(code).build());
        // 数据返回给前端
        return ResponseResult.ok(login);
    }

    private AuthRequest getAuthRequest(){
        // 创建授权request
        AuthRequest authRequest = new AuthGiteeRequest(AuthConfig.builder()
                .clientId(clientID)
                .clientSecret(clientSecret)
                .redirectUri("http://127.0.0.1:7125/callback")
                .build());
        return authRequest;
    }

}

测试

访问localhost:7125/login/home

授权登录

前端获取到基本信息

相关推荐
wxwx_bscxy32243 分钟前
基于Python新冠疫情可视化分析系统的设计与实现
java·数据库·spring boot·python·微信小程序·sqlite
evans在进步2 小时前
Tomcat NIO 工作原理详解:从 Acceptor、Poller 到容器处理链
java·tomcat·nio
IT_陈寒3 小时前
React的状态更新坑得我差点加班到天亮
前端·人工智能·后端
渡我白衣3 小时前
并查集:基础认识与模拟实现
android·java·javascript·数据结构·c++·算法·并查集
电商API_180079052473 小时前
电商商品价格监控工具淘宝京东商品价格抓取API项目实操分享
java·大数据·开发语言·前端·数据挖掘
zzzll11113 小时前
深度剖析:HashMap 并发死循环与 ConcurrentHashMap 两代演进全解
java·开发语言
秋名RG3 小时前
2026/5/27 生产事故复盘与整改方案
java
码事漫谈4 小时前
一天搭出 80% 的 Agent,然后卡在 95% 到死
后端
leonkay4 小时前
C# 锁机制——【2】深入原理
开发语言·后端·spring·c#·个人开发
血小板要健康4 小时前
链表 阶段算法总结
java·数据结构·笔记·算法·leetcode·链表