使用JustAuth实现gittee登录

使用JustAuth实现gittee登录

登录流程:

  • 点击 Github 图标时,调用 handleGiteeLogin
  • 获取 Gitee 登录地址并跳转
  • Gitee 授权后,后端进行相关的验证登录等
  • 成功后回调到gitee填的回调地址

1.添加依赖

<dependency><groupId>me.zhyd.oauth</groupId><artifactId>JustAuth</artifactId><version>1.16.5</version>
/dependency>

2.在 Gitee 创建应用获取必要的参数:

登录 Gitee

进入设置 -> 第三方应用

创建应用,获取 Client ID 和 Client Secret

设置回调地址,如: http://localhost:8080/oauth/gitee/callback

3.创建配置类

@Configuration
@ConfigurationProperties(prefix = "gitee")
@Data
public class JustAuthConfig {private String clientId;private String clientSecret;private String redirectUri;@Bean("giteeAuthRequest")  // 指定 Bean 名称public AuthGiteeRequest authGiteeRequest() {return new AuthGiteeRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret).redirectUri(redirectUri).build());}
}

4.在 application.yml 中配置参数

gitee:client-id: 你的ClientIDclient-secret: 你的ClientSecretredirect-uri: 回调地址

5.登录控制器

package com.qiheyehua.qiheyuehuajavaee.controller;import com.qiheyehua.qiheyuehuajavaee.Service.UserService;
import com.qiheyehua.qiheyuehuajavaee.domain.entity.User;
import com.qiheyehua.qiheyuehuajavaee.domain.vo.UserVO;
import com.qiheyehua.qiheyuehuajavaee.utils.JwtUtil;
import com.qiheyehua.qiheyuehuajavaee.utils.Result;import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;import me.zhyd.oauth.exception.AuthException;
import me.zhyd.oauth.model.AuthCallback;
import me.zhyd.oauth.model.AuthResponse;
import me.zhyd.oauth.model.AuthUser;
import me.zhyd.oauth.request.AuthGiteeRequest;import me.zhyd.oauth.utils.AuthStateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;
import java.util.Map;@RequestMapping("/oauth")
@RestController
@RequiredArgsConstructor
@Slf4j
public class OauthController {@Qualifier("giteeAuthRequest")  // 指定要注入的 Bean 名称@Autowiredprivate AuthGiteeRequest authGiteeRequest;@Autowiredprivate UserService userService;@Autowiredprivate JwtUtil jwtUtil;@GetMapping("/gitee/render")public Result<String> renderAuth() {String state = AuthStateUtils.createState();String authorizeUrl = authGiteeRequest.authorize(state);return Result.success(authorizeUrl);}@GetMapping("/gitee/callback")public Result<Object> login(AuthCallback callback) {try {// 1. 获取 Gitee 用户信息AuthResponse<AuthUser> response = authGiteeRequest.login(callback);AuthUser authUser = response.getData();// 2. 检查用户是否存在,不存在则创建User user = userService.getByGiteeId(authUser.getUuid());if (user == null) {// 创建新用户user = new User();user.setGiteeId(authUser.getUuid());user.setAvatar(authUser.getAvatar());user.setUsername(authUser.getUsername());user.setPhone(authUser.getNickname());// 保存用户并获取生成的 IDboolean save = userService.save(user);if (!save) {throw new RuntimeException("创建用户失败");}} else {// 如果用户存在,更新用户信息user.setAvatar(authUser.getAvatar());user.setUsername(authUser.getUsername());user.setPhone(authUser.getNickname());boolean updated = userService.updateById(user);if (!updated) {throw new RuntimeException("更新用户信息失败");}}// 3. 生成 tokenString token = jwtUtil.generateToken(user.getUserId().intValue(), user.getUsername());// 4. 构建返回结果Map<String, Object> result = new HashMap<>(3);result.put("token", token);result.put("userInfo", UserVO.builder().userId(user.getUserId()).username(user.getUsername()).avatar(user.getAvatar()).phone(user.getPhone()).build());return Result.success(result);} catch (AuthException e) {log.error("Gitee登录失败", e);return Result.error(e.getMessage());}}
}

6.前端页面

前端页面,主要是实现点击gitee图标从后端得到连接跳转授权

<!-- 社交登录按钮 --><div class="flex justify-center space-x-4"><buttontype="button"class="p-2 rounded-full bg-white/10 hover:bg-white/20 transition-colors flex items-center space-x-2"@click="handleGiteeLogin"><svg viewBox="0 0 1024 1024" class="w-6 h-6 text-white"><pathfill="currentColor"d="M512 1024C229.222 1024 0 794.778 0 512S229.222 0 512 0s512 229.222 512 512-229.222 512-512 512z m259.149-568.883h-290.74a25.293 25.293 0 0 0-25.292 25.293l-0.026 63.206c0 13.952 11.315 25.293 25.267 25.293h177.024c13.978 0 25.293 11.315 25.293 25.267v12.646a75.853 75.853 0 0 1-75.853 75.853h-240.23a25.293 25.293 0 0 1-25.267-25.293V417.203a75.853 75.853 0 0 1 75.827-75.853h353.946a25.293 25.293 0 0 0 25.267-25.292l0.077-63.207a25.293 25.293 0 0 0-25.268-25.293H417.152a189.62 189.62 0 0 0-189.62 189.645V771.15c0 13.977 11.316 25.293 25.294 25.293h372.94a170.65 170.65 0 0 0 170.65-170.65V480.384a25.293 25.293 0 0 0-25.293-25.267z"></path></svg><span class="text-white text-sm">Gitee 登录</span></button></div>

js代码

         // Gitee 登录处理
const handleGiteeLogin = async () => {try {const res = await getGiteeLoginUrl()if (res.code === 200) {// 使用 window.location.href 进行跳转,这样会刷新页面window.location.href = res.data}} catch (error) {console.error('获取 Gitee 登录地址失败:', error)ElMessage.error('获取 Gitee 登录地址失败')}
}

封装的请求

// 获取 Gitee 登录地址
export function getGiteeLoginUrl() {return request({url: '/oauth/gitee/render',method: 'get'})
}

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

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

相关文章

矩阵的基本知识

例题1&#xff1a;求矩阵最小值&#xff0c;和其所在的行和列 #include<stdio.h> int main() { int arr[10][10]; int g; scanf("%d",&g); int m,n,i,r c; for(i0;i<g;i) { scanf("%d %d",&m,&…

《Vue3实战教程》5:响应式基础

如果您有疑问&#xff0c;请观看视频教程《Vue3实战教程》 响应式基础​ API 参考 本页和后面很多页面中都分别包含了选项式 API 和组合式 API 的示例代码。现在你选择的是 组合式 API。你可以使用左侧侧边栏顶部的“API 风格偏好”开关在 API 风格之间切换。 声明响应式状态…

【后端面试总结】深入解析进程和线程的区别

在操作系统和并发编程中&#xff0c;进程和线程是两个核心概念。它们各自承担着不同的职责&#xff0c;并在多任务处理中发挥着关键作用。本文将从定义、特性、应用场景以及优缺点等多个方面对进程和线程进行详细对比&#xff0c;帮助读者深入理解它们之间的区别。 一、进程和…

QT网络(二):TCP通信

传输层概念 传输控制协议&#xff08;transmission control protocol&#xff0c;TCP&#xff09;是一种被大多数 Internet 网络协议用于数据传输的底层网络协议&#xff0c;它是可靠的、面向流和连接的传输协议&#xff0c;特别适合用于连续数据传输。 应用层在网络模型中的…

【记录50】uniapp安装uview插件,样式引入失败分析及解决

SassError: Undefined variable: "$u-border-color". 表示样式变量$u-border-color没定义&#xff0c;实际是定义的 首先确保安装了scss/sass 其次&#xff0c;根目录下 app.vue中是否全局引入 <style lang"scss">import /uni_modules/uview-ui/in…

std::async 和 std::packaged_task

0、背景 在现代 C 中&#xff0c;std::async 和 std::packaged_task 是两个非常重要的工具&#xff0c;能够帮助我们更好地处理并发和异步操作。它们分别代表了异步执行任务的两种不同的方式&#xff0c;但都可以有效地将任务的执行从主线程或调用线程中分离出来&#xff0c;以…

windows上安装Redis

下载&#xff1a;https://github.com/tporadowski/redis&#xff08;官方不提供windows版&#xff09; 配置文件里设置密码&#xff1a;requirepass 123456 添加服务的命令&#xff1a; redis-server --service-install redis.windows-service.conf --loglevel verbose (--serv…

TypeScript 与 JavaScript

文章目录 一、为 JavaScript 库添加类型定义(一)什么是类型定义文件(.d.ts 文件)(二)手动编写类型定义和使用现有类型定义(如 DefinitelyTyped)手动编写类型定义使用现有类型定义(如 DefinitelyTyped)二、在 TypeScript 项目中使用流行的 JavaScript 库(如 jQuery、…

从源码构建安装Landoop kafka-connect-ui

背景 部署Landoop kafka-connect-ui最简单的办法还是通过docker来部署&#xff0c;我们之前的kafka-connect-ui就是通过docker部署的&#xff0c;但是&#xff0c;最近发现个问题&#xff1a;当使用docker部署且防火墙使用的是firewalld的情况下&#xff0c;就会出现端口冲突。…

算法—动态规划

一、简介 动态规划&#xff08;Dynamic Programming&#xff0c;简称 DP&#xff09;是一种通过将原问题分解为若干个子问题来求解最优化问题的算法思想。动态规划常常用于解决那些可以被分解为更小的重叠子问题的场景。 与分治法的区别在于&#xff0c;分治法会将问题分解成独…

Android GO 版本锁屏声音无效问题

问题描述 Android go版本 在设置中打开锁屏音开关&#xff0c;息屏灭屏还是无声音 排查 vendor\mediatek\proprietary\packages\apps\SystemUI\src\com\android\systemui\keyguard\KeyguardViewMediator.java private void setupLocked() {...String soundPath Settings.G…

使用 NVIDIA DALI 计算视频的光流

引言 光流&#xff08;Optical Flow&#xff09;是计算机视觉中的一种技术&#xff0c;主要用于估计视频中连续帧之间的运动信息。它通过分析像素在时间维度上的移动来预测运动场&#xff0c;广泛应用于目标跟踪、动作识别、视频稳定等领域。 光流的计算传统上依赖 CPU 或 GP…

Tomcat的安装即使用

Tomcat的概念 Tomcat服务器是Java语言开发的&#xff0c;免费的开放源代码的Web应用服务器。 Tomcat处理静态HTML的能力远不及Apache或者Nginx&#xff0c;通常是作为一个Servlet和JSP容器&#xff0c;单独运行在后端。 Tomcat是由三个功能组合而成&#xff1a; java servlet&…

Linux:进程(环境变量、程序地址空间)

目录 冯诺依曼体系结构 操作系统 设计操作系统的目的 操作系统的管理 进程 PCB fork 进程状态 进程状态查看 僵尸进程 孤儿进程 进程优先级 查看、修改进程优先级命令 竞争、独立、并行、并发 进程切换 活动队列和运行队列 活动队列 过期队列 active指针…

对于使用exe4j打包,出现“NoClassDefFoundError: BOOT-INF/classes”的解决方案

jar使用exe4j打包exe&#xff0c;出现NoClassDefFoundError: BOOT-INF/classes 注意选取的jar包是使用build&#xff0c;而不是maven中的install 本文介绍解决这个方法的方案 点击Project Structure 按照如图所示选择 选择main class&#xff0c;选择你要打的main 如果遇到/M…

SpringBoot 编程式事务使用

目录 1. 简介2. TransactionTemplate 方式3. TransactionManager 方式4. 事务传播行为5. 事务隔离级别6. 最佳实践7. 常见问题与解决方案 1. 简介 编程式事务管理是通过编写代码来管理事务&#xff0c;相对于声明式事务&#xff08;Transactional注解&#xff09;&#xff0…

uniapp连接蓝牙操作(蓝牙设备地锁)

介绍&#xff1a; 本文采用uni-app框架来创建一个简单的用户界面&#xff0c;用于搜索、连接和发送命令给蓝牙设备。 1.打开蓝牙适配器 function openBluetooth() {uni.openBluetoothAdapter({success() {uni.offBluetoothDeviceFound();// 监听新设备发现事件uni.onBlueto…

web:pc端企业微信登录-vue版

官方文档&#xff1a;developer.work.weixin.qq.com/document/pa… 不需要调用ww.register&#xff0c;直接调用ww.createWWLoginPanel即可创建企业微信登录面板 - 文档 - 企业微信开发者中心 (qq.com) 引入 //通过 npm 引入 npm install wecom/jssdk import * as ww from we…

登陆harbor发现证书是错误的, 那么如何更新harbor的证书呢

Error response from daemon: Get "https://172.16.21.35/v2/": tls: failed to verify certificate: x509: certificate is valid for 127.0.0.1, ::1, 172.16.21.30, not 172.16.21.35 版本 v2.10.1-b7b88476 不需要从头看, 直接看最下面的成功的证书创建 这里面首…

外观模式的理解和实践

外观模式&#xff08;Facade Pattern&#xff09;是一种常用的软件设计模式&#xff0c;它提供了一个统一的接口&#xff0c;用来访问子系统中的一群接口。该模式定义了一个高层的接口&#xff0c;使得子系统更容易使用。简单来说&#xff0c;外观模式就是通过引入一个外观角色…