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

nbcio-boot如何进行gitee第三方登录

更多nbcio-boot功能请看演示系统

       gitee源代码地址

       后端代码: https://gitee.com/nbacheng/nbcio-boot

      前端代码:https://gitee.com/nbacheng/nbcio-vue.git

      在线演示(包括H5) : http://122.227.135.243:9888

1、用户gitee授权登录后可以直接绑定相应的手机号进行直接登录。

比如下面例子

/*** gitee第三方绑定后直接通过admin用户返回token** @param jsonObject* @return*/@ApiOperation("gitee登录接口")@PostMapping("/bindingGitee")@ResponseBodypublic Result<String> bindingGitee(@RequestBody JSONObject jsonObject) {Result<String> result = new Result<String>();//固定使用admin的手机号登录SysUser sysUser = sysUserService.getUserByPhone("13988888888");String token = saveToken(sysUser);result.setSuccess(true);result.setResult(token);return result;}

2、建立一个通用的gitee操作类

import java.io.IOException;
import java.net.URISyntaxException;import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.springframework.stereotype.Component;import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;@Component
public class GiteeHttpClient {/*** 获取Access Token* post*/public static JSONObject getAccessToken(String url) throws IOException {HttpClient client = HttpClients.createDefault();HttpPost httpPost = new HttpPost(url);
//        httpPost.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36");HttpResponse response = client.execute(httpPost);HttpEntity entity = response.getEntity();if (null != entity) {String result = EntityUtils.toString(entity, "UTF-8");return JSONObject.parseObject(result);}httpPost.releaseConnection();return null;}/*** 获取用户信息* get*/public static JSONObject getUserInfo1(String url) throws IOException {JSONObject jsonObject = null;CloseableHttpClient client = HttpClients.createDefault();HttpGet httpGet = new HttpGet(url);httpGet.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36");HttpResponse response = client.execute(httpGet);HttpEntity entity = response.getEntity();if (entity != null) {String result = EntityUtils.toString(entity, "UTF-8");jsonObject = JSONObject.parseObject(result);}httpGet.releaseConnection();return jsonObject;}//    https://gitee.com/api/v5/user/*** 获取授权用户的资料* gitee get方式获取用户信息*/public static JSONObject getUserInfo(String token,String url) throws IOException, URISyntaxException {JSONObject jsonObject = null;CloseableHttpClient client = HttpClients.createDefault();URIBuilder builder = new URIBuilder(url);builder.setParameter("access_token", token);HttpGet httpGet = new HttpGet(builder.build());httpGet.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36");HttpResponse response = client.execute(httpGet);HttpEntity entity = response.getEntity();if (entity != null) {String result = EntityUtils.toString(entity, "UTF-8");jsonObject = JSONObject.parseObject(result);}httpGet.releaseConnection();return jsonObject;}public static JSONArray getArray(String token,String url) throws IOException, URISyntaxException {JSONArray jsonArray = null;CloseableHttpClient client = HttpClients.createDefault();URIBuilder builder = new URIBuilder(url);builder.setParameter("access_token", token);HttpGet httpGet = new HttpGet(builder.build());httpGet.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36");HttpResponse response = client.execute(httpGet);HttpEntity entity = response.getEntity();if (entity != null) {String result = EntityUtils.toString(entity, "UTF-8");jsonArray = JSONObject.parseArray(result);}httpGet.releaseConnection();return jsonArray;}public static JSONObject put(String token,String url,JSONObject json) throws IOException, URISyntaxException {JSONObject jsonObject = null;CloseableHttpClient client = HttpClients.createDefault();URIBuilder builder = new URIBuilder(url);builder.setParameter("access_token", token);json.keySet().forEach((k)->{builder.setParameter(k,json.getString(k));});HttpPut httpPut = new HttpPut(builder.build());httpPut.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36");HttpResponse response = client.execute(httpPut);HttpEntity entity = response.getEntity();if (entity != null) {String result = EntityUtils.toString(entity, "UTF-8");jsonObject = JSONObject.parseObject(result);}httpPut.releaseConnection();return jsonObject;}public static JSONObject post(String token,String url,JSONObject json) throws IOException, URISyntaxException {JSONObject jsonObject = null;CloseableHttpClient client = HttpClients.createDefault();URIBuilder builder = new URIBuilder(url);builder.setParameter("access_token", token);json.keySet().forEach((k)->{builder.setParameter(k,json.getString(k));});HttpPost httpPost = new HttpPost(builder.build());httpPost.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36");HttpResponse response = client.execute(httpPost);HttpEntity entity = response.getEntity();if (entity != null) {String result = EntityUtils.toString(entity, "UTF-8");jsonObject = JSONObject.parseObject(result);}httpPost.releaseConnection();return jsonObject;}
}

3、也可以考虑做一个类似下面的第三方gitee服务,如

/*** 第三方(GITEE)登录服务*/
@Service
public class ThirdLoginService {@Autowiredpublic SysUserService userService;@Value("${vlife.gitee.client_id}")public String client_id;@Value("${vlife.gitee.redirect_uri}")public String redirect_uri;@Value("${vlife.gitee.client_secret}")public String client_secret;@Value("${vlife.email.from}")public String emailFrom;@Value("${vlife.email.pwd}")public String emailPwd;public Boolean  openCheckCode(){if(StringUtils.isNotEmpty(emailFrom)&&StringUtils.isNotEmpty(emailPwd)) {return true;}else{return false;}}/*** 获得第三方账号用户token* @param code*/public String thirdToken(String code,String from){String gitToken=null;try {JSONObject jsonObject= GiteeHttpClient.getAccessToken("https://gitee.com/oauth/token?" +"grant_type=authorization_code&code="+code+"&client_id="+client_id+"&redirect_uri="+redirect_uri+"&client_secret="+client_secret);gitToken=jsonObject.getString("access_token");}catch (Exception exception){exception.printStackTrace();}return gitToken;}/*** 获得第三方用户信息*/public ThirdAccountDto account(String thirdToken, String from){ThirdAccountDto account=null;try {JSONObject userObj=GiteeHttpClient.getUserInfo(thirdToken,"https://gitee.com/api/v5/user");account=new ThirdAccountDto();account.setId(userObj.getString("id"));account.setName(userObj.getString("name"));account.setEmail(userObj.getString("email"));account.setUsername(userObj.getString("login"));account.setThirdToken(thirdToken);account.setAvatar(userObj.getString("avatar_url"));account.setFrom(from);}catch (Exception exception){exception.printStackTrace();}return account;}/*** 获得第三方用户信息*/public String email(String token, String from){String email=null;try {JSONObject userObj=GiteeHttpClient.getArray(token,"https://gitee.com/api/v5/emails").getJSONObject(0);email= userObj.getString("email");}catch (Exception exception){exception.printStackTrace();}return email;}public SysUser createUser(ThirdAccountDto accountDto){SysUser user=new SysUser();
//        user.setSysOrgId(sysOrgId);user.setSysGroupId("super");user.setSysDeptId("4028b8818747df52018747dfdf780000");user.setState("1");
//        user.setUsername(accountDto.getUsername());user.setThirdId(accountDto.getId());user.setName(accountDto.getName());user.setEmail(accountDto.getEmail());user.setSource(accountDto.getFrom());user.setThirdToken(accountDto.getThirdToken());user.setAvatar(accountDto.getAvatar());return user;}/* 发送验证信息的邮件 */public  String sendMail(String to,String code) {if( emailFrom==null|| emailPwd==null){return "邮件服务信息服务端未设置,不能发送邮件";}Properties props = new Properties();props.setProperty("mail.smtp.host", "smtp.163.com");props.put("mail.smtp.host", "smtp.163.com");props.put("mail.smtp.auth", "true");Session session = Session.getDefaultInstance(props);session.setDebug(true);MimeMessage message = new MimeMessage(session);try {message.setSentDate(new Date());SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");message.setFrom(new InternetAddress(emailFrom));message.addRecipient(Message.RecipientType.TO, new InternetAddress(to)); // 加载收件人地址message.setSubject("低代码平台验证码","utf-8");Multipart multipart = new MimeMultipart(); // 向multipart对象中添加邮件的各个部分内容,包括文本内容和附件BodyPart contentPart = new MimeBodyPart(); // 设置邮件的文本内容String str = "<!DOCTYPE html><html><head><meta charset='UTF-8'></head><body><p style='font-size: 20px;font-weight:bold;'>尊敬的用户,您好!</p>"+ "<p style='text-indent:2em; font-size: 20px;'>欢迎您使用vlife低代码平台,您本次的注册码是 "+ "<span style='font-size:30px;font-weight:bold;color:red'>" + code + "</span>,10分钟之内有效,请尽快使用!</p>"+ "<p style='text-align:right; padding-right: 20px;'"+ "<a href='http://www.vlife.cc' style='font-size: 18px'>了解更多请访问vlife使用指南</a></p>"+ "<span style='font-size: 18px; float:right; margin-right: 60px;'>" + sdf.format(new Date()) + "</span></body></html>";contentPart.setContent(str, "text/html;charset=utf-8");multipart.addBodyPart(contentPart);message.setContent(multipart);message.saveChanges(); // 保存变化Transport transport = session.getTransport("smtp"); // 连接服务器的邮箱transport.connect("smtp.163.com", emailFrom, emailPwd); // 把邮件发送出去transport.sendMessage(message, message.getAllRecipients());transport.close();} catch (MessagingException e) {e.printStackTrace();return "发送失败:"+e.getMessage();}return null;}}

相关文章:

nbcio-boot如何进行gitee第三方登录

更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; https://gitee.com/nbacheng/nbcio-boot 前端代码&#xff1a;https://gitee.com/nbacheng/nbcio-vue.git 在线演示&#xff08;包括H5&#xff09; &#xff1a; http://122.227.135.243:9888 1、用户g…...

【C语言】字符函数、字符串函数与内存函数

简单不先于复杂&#xff0c;而是在复杂之后。 目录 0. 前言 1. 函数介绍 1.1 strlen 1.1.1 介绍 1.1.2 strlen 函数模拟实现 1.1.2.1 计数器方法 1.1.2.2 递归方法 1.1.2.3 指针 - 指针方法 1.2 strcpy 1.2.1 介绍 1.2.2 strcpy 函数模拟实现 1.3 strcat 1…...

生成树协议:监控 STP 端口和交换机

什么是生成树协议 生成树协议 &#xff08;STP&#xff09; 用于网络交换机&#xff0c;以防止循环和广播风暴。在局域网 &#xff08;LAN&#xff09; 中&#xff0c;两条或多条冗余路径可以连接到同一网段。当交换机或网桥从所有可用端口传输帧时&#xff0c;这些帧开始在网…...

【黑产攻防道03】利用JS参数更新检测黑产的协议破解

任何业务在运营一段时间之后都会面临黑产大量的破解。验证码和各种爬虫的关系就像猫和老鼠一样, 会永远持续地进行博弈。极验根据十一年和黑产博弈对抗的经验&#xff0c;将黑产的破解方式分为三类&#xff1a; 1.通过识别出验证码图片答案实现批量破解验证&#xff0c;即图片…...

什么是web3.0?

Web 3.0&#xff0c;也常被称为下一代互联网&#xff0c;代表着互联网的下一个重大演变。尽管关于Web 3.0的确切定义尚无共识&#xff0c;但它通常被认为是一种更分散、更开放且更智能的互联网。 以下是Web 3.0的一些主要特征和概念&#xff1a; 1. 去中心化 Web 3.0旨在减少…...

二、W5100S/W5500+RP2040树莓派Pico<DHCP>

文章目录 1 前言2 简介2 .1 什么是DHCP&#xff1f;2.2 为什么要使用DHCP&#xff1f;2.3 DHCP工作原理2.4 DHCP应用场景 3 WIZnet以太网芯片4 DHCP网络设置示例概述以及使用4.1 流程图4.2 准备工作核心4.3 连接方式4.4 主要代码概述4.5 结果演示 5 注意事项6 相关链接 1 前言 …...

【开源】基于SpringBoot的天然气工程业务管理系统的设计和实现

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、使用角色3.1 施工人员3.2 管理员 四、数据库设计4.1 用户表4.2 分公司表4.3 角色表4.4 数据字典表4.5 工程项目表4.6 使用材料表4.7 使用材料领用表4.8 整体E-R图 五、系统展示六、核心代码6.1 查询工程项目6.2 工程物资…...

讯飞星火大模型V3.0 WebApi使用

讯飞星火大模型V3.0 WebApi使用 文档说明&#xff1a;星火认知大模型Web文档 | 讯飞开放平台文档中心 (xfyun.cn) 实现效果 初始化 首先构建一个基础脚手架项目 npm init vuelatest用到如下依赖 "dependencies": {"crypto-js": "^4.2.0",&q…...

拥有DOM力量的你究竟可以干什么

如果你希望访问 HTML 页面中的任何元素&#xff0c;那么您总是从访问 document 对象开始&#xff01; 查找HTML元素 document.getElementById(id) 通过元素 id 来查找元素 <!DOCTYPE html> <html> <head><meta charset…...

GnuTLS recv error (-110): The TLS connection was non-properly terminated

ubuntu git下载提示 GnuTLS recv error (-110): The TLS connection was non-properly terminated解决方法 git config --global --unset http.https://github.com.proxy...

Notepad++安装插件和配置快捷键

Notepad是一款轻量级、开源的文件编辑工具&#xff0c;可以编辑、浏览文本文件、二进制文件、.cpp、.java、*.cs等文件。Notepad每隔1个月&#xff0c;就有一个新版本&#xff0c;其官网是&#xff1a; https://github.com/notepad-plus-plus/notepad-plus-plus。这里介绍其插件…...

iOS Autolayout 约束设置【顺序】的重要性!

0x00 顺序不同&#xff0c;结果不同 看图说话 1 代码是这样滴~ 设置好约束&#xff0c;让 4 个按钮&#xff0c;宽度均分~ 结果如上图 [_pastButton.topAnchor constraintEqualToAnchor:_textView.bottomAnchor constant:6].active YES;[_pastButton.leftAnchor constraintEq…...

Echarts渲染不报错但是没有内容

&#x1f525;博客主页&#xff1a; 破浪前进 &#x1f516;系列专栏&#xff1a; Vue、React、PHP ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 问题&#xff1a;在开发项目的时候使用了Echarts但是好端端的忽然就不渲染了 感觉很无语啊&#xff0c;毕竟好好的就不渲染了&am…...

数据结构 | 算法的时间复杂度和空间复杂度【详解】

数据结构 | 算法的时间复杂度和空间复杂度【详解】 1. 什么是数据结构&#xff1f; 数据结构(Data Structure)是计算机存储、组织数据的方式&#xff0c;指相互之间存在一种或多种特定关系的数据元素的集合。 2. 什么是算法&#xff1f; 算法(Algorithm):就是定义良好的计算过…...

高级篇之ENC编码器多机位帧同步配置详解

高级篇之ENC编码器多机位帧同步配置详解 一 帧同步方案多样性1. 配合vMIX导播的帧同步方案3. 配合硬件导播的帧同步方案3. 配合芯象导播的帧同步 二 帧同步方案1实现步骤1. 准备设备2. 搭建环境3 配置设备3.1 配置固定机位3.2 配置帧同步转发端3.3 配置vMIX 三 效果对比1 不开帧…...

matlab simulink 四旋翼跟拍无人机仿真

1、内容简介 略 7-可以交流、咨询、答疑 2、内容说明 四旋翼跟拍无人机仿真 四旋翼、无人机 需求分析 背景介绍 无人飞行机器人&#xff0c;是无人驾驶且具有一定智能的空中飞行器。这是一种融合了计算机技术、人工智能技术、传感器技术、自动控制技术、新型材料技术、导航…...

jenkins、ant、selenium、testng搭建自动化测试框架

如果在你的理解中自动化测试就是在eclipse里面讲webdriver的包引入&#xff0c;然后写一些测试脚本&#xff0c;这就是你所说的自动化测试&#xff0c;其实这个还不能算是真正的自动化测试&#xff0c;你见过每次需要运行的时候还需要打开eclipse然后去选择运行文件吗&#xff…...

【阅读和学习代码】VoxelNet

文章目录 将点特征 转换为 voxel 特征稀疏张量 到 稠密张量&#xff0c;反向索引参考博客 将点特征 转换为 voxel 特征 https://github.com/skyhehe123/VoxelNet-pytorch/blob/master/data/kitti.py 【Python】np.unique() 介绍与使用 self.T &#xff1a; # maxiumum numbe…...

【23种设计模式】接口隔离原则

个人主页&#xff1a;金鳞踏雨 个人简介&#xff1a;大家好&#xff0c;我是金鳞&#xff0c;一个初出茅庐的Java小白 目前状况&#xff1a;22届普通本科毕业生&#xff0c;几经波折了&#xff0c;现在任职于一家国内大型知名日化公司&#xff0c;从事Java开发工作 我的博客&am…...

【Python机器学习】零基础掌握PartialDependenceDisplay检验、检查

如何更好地理解模型对特定特征的依赖性?如何使用历史数据来预测明天股票市场的走势? 想象一下,作为一名数据分析师,面对海量的数据,如何准确地预测明天股票市场的走势?这是一个复杂且具有挑战性的问题。但别担心,有一种神奇的工具可以帮助解析模型对各种因素(特征)的…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...

实战三:开发网页端界面完成黑白视频转为彩色视频

​一、需求描述 设计一个简单的视频上色应用&#xff0c;用户可以通过网页界面上传黑白视频&#xff0c;系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观&#xff0c;不需要了解技术细节。 效果图 ​二、实现思路 总体思路&#xff1a; 用户通过Gradio界面上…...

DBLP数据库是什么?

DBLP&#xff08;Digital Bibliography & Library Project&#xff09;Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高&#xff0c;数据库文献更新速度很快&#xff0c;很好地反映了国际计算机科学学术研…...

[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG

TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码&#xff1a;HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...

《Offer来了:Java面试核心知识点精讲》大纲

文章目录 一、《Offer来了:Java面试核心知识点精讲》的典型大纲框架Java基础并发编程JVM原理数据库与缓存分布式架构系统设计二、《Offer来了:Java面试核心知识点精讲(原理篇)》技术文章大纲核心主题:Java基础原理与面试高频考点Java虚拟机(JVM)原理Java并发编程原理Jav…...

WEB3全栈开发——面试专业技能点P4数据库

一、mysql2 原生驱动及其连接机制 概念介绍 mysql2 是 Node.js 环境中广泛使用的 MySQL 客户端库&#xff0c;基于 mysql 库改进而来&#xff0c;具有更好的性能、Promise 支持、流式查询、二进制数据处理能力等。 主要特点&#xff1a; 支持 Promise / async-await&#xf…...

React核心概念:State是什么?如何用useState管理组件自己的数据?

系列回顾&#xff1a; 在上一篇《React入门第一步》中&#xff0c;我们已经成功创建并运行了第一个React项目。我们学会了用Vite初始化项目&#xff0c;并修改了App.jsx组件&#xff0c;让页面显示出我们想要的文字。但是&#xff0c;那个页面是“死”的&#xff0c;它只是静态…...