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;}}

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

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

相关文章

【开题报告】基于Spring Boot的家装产品展示交易平台的设计与实现

1.研究背景和目的 随着人们对居住环境舒适度和个性化需求的不断提升&#xff0c;家装市场正逐渐发展成为一个重要的消费领域。为了满足消费者对家装产品的需求&#xff0c;建立一个高效、可靠的家装产品展示交易平台变得尤为重要。本项目旨在通过使用Spring Boot框架&#xff…

Dockerfile文件详细教程

写在前面 Dockerfile是用来构建镜像的,他实际上就是把在linux下的命令操作写到了Dockerfile中,通过Dockerfile去执行设置好的操作命令,保证通过Dockerfile的构建镜像是一致的。 实战分析 该例子来自于 chromium 项目 主要干的事情: 来指定用哪个镜像;安装一些编译需要的…

深入理解Python中的元类

Python元类&#xff1a;metaclass 1、类也是对象2、什么是元类3、__metaclass__属性4、自定义元类5、为什么要用metaclass类而不是函数6、究竟为什么要使用元类7、结语 声明&#xff1a; 本文主要参考文章&#xff1a;https://stackoverflow.com/questions/100003/what-are-met…

安卓逆向之雷电模拟器中控

一, 雷电模拟器 安装使用 官方地址: https://www.ldmnq.com ,官方论坛 https://www.ldmnq.com/forum/ . 有一个多开管理器,还有就是设置手机的参数比较关键。 二,雷电模拟器开启面具,安装LSP。 设置root 权限。

【数据结构实战项目】C语言实现数据结构顺序表万字详解(附完整运行代码)

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 一.了解项目功能 在本次项目中我们的目标是实现一个顺序表: 该顺序表使用动态内存分配,可以用来存储任意数量的同类型数据. 顺序表需要包含三个要素:存储数据的数组arr,顺序表…

【操作系统】848真题总结(20-23)

【操作系统】848真题答案及总结&#xff08;20-23&#xff09; 文章目录 【操作系统】848真题答案及总结&#xff08;20-23&#xff09;写在前面:选择题&#xff1a;2020202120222023 填空题&#xff1a;2020202120222023 判断题&#xff1a;2020202120222023 简答题&#xff1…

Python程序设计期末复习笔记

文章目录 一、数据存储1.1 倒计时1.2 os库1.3 字符串操作1.4 文件操作1.5 列表操作1.6 元组1.7 字典 二、文本处理及可视化2.1 jieba分词2.2 集合操作2.3 pdf文件读取2.4 参数传递2.5 变量作用域 三、数据处理分析3.1 Sumpy3.2 Matplotlib3.3 Numpy 四、Pandas4.1 索引操作4.2 …

UE5.3启动C++项目报错崩溃

最近尝试用C来练习&#xff0c;碰到一个启动崩溃的事情 按照官方给的步骤做的&#xff1a;官方链接 结果是自定义的Character的问题&#xff0c;在自定义Character的构造函数里调用了&#xff1a; check(GEngine ! nullptr); GEngine->AddOnScreenDebugMessage(-1, 5, FCol…

技术视角下的跑腿小程序开发:关键挑战和解决方案

跑腿小程序作为连接服务提供者和用户的桥梁&#xff0c;面临着诸多技术挑战。本文将聚焦于技术层面的关键挑战&#xff0c;并提供解决方案&#xff0c;以帮助开发者应对技术上的复杂问题。 1. 实时性与性能挑战 挑战&#xff1a; 跑腿小程序需要实时地匹配订单、更新状态和提…

40基于MATLAB,使用模板匹配法实现车牌的识别。

基于MATLAB&#xff0c;使用模板匹配法实现车牌的识别。具体包括将原图灰度化&#xff0c;边缘检测&#xff0c;腐蚀操作&#xff0c;车牌区域定位&#xff0c;车牌区域矫正&#xff0c;二值化&#xff0c;均值滤波&#xff0c;切割&#xff0c;字符匹配&#xff0c;最终显示车…

小程序request请求封装

以上为本人的项目目录 1.首先在utils中创建request.js文件封装request请求&#xff0c;此封装带上了token&#xff0c;每次请求都会自带token&#xff0c;需要你从后端获取后利用wx.setStorageSync(token,返回的token),不使用的话就是空。 直接复制即可&#xff0c;需要改一下…

(三)库存超卖案例实战——使用redis分布式锁解决“超卖”问题

前言 在上一节内容中我们介绍了如何使用mysql数据库的传统锁&#xff08;行锁、乐观锁、悲观锁&#xff09;来解决并发访问导致的“超卖问题”。虽然mysql的传统锁能够很好的解决并发访问的问题&#xff0c;但是从性能上来讲&#xff0c;mysql的表现似乎并不那么优秀&#xff…

vue3后台管理系统之跨域代理

vite.config.js中 server: {port: 5002,host: true, //0.0.0.0open: false,strictPort: true,proxy: {// 请求前缀/api&#xff0c;只有加了/api前缀的请求才会走代理(前端自定义)/api: {target: http://127.0.0.1:8000,// 获取服务器地址的设置changeOrigin: true,// 路径重写…

判断时间是否连续

判断多个时间是否排序 思路当多参的时间传过来,先排序,然后遍历集合对比是否连续的只要一处不是连续的就直接返回false //判断时间是否连续的public static Boolean verificationDate(Date... dates) throws ParseException {boolean flag true;SortedSet<Date> setDat…

AMD HIP并行编程语言及其矢量相加实例——一文带你快速入门

✍️写在前面&#xff1a;随着计算的应用场景变得日益复杂多样&#xff0c;为了跟上人工智能算法对算力的需求&#xff0c;GPU硬件架构快速走向多样化&#xff0c;GPU生产厂家众多&#xff0c;且在商业和市场等因素的影响下&#xff0c;GPU通用计算编程模型也日益多元化。因此&…

Gateway一个诡异问题处理过程

一、前言 我们搭好了网关和一个基础微服务&#xff08;含用户体系、门店服务、商品服务、客户服务&#xff09;&#xff0c;然后用APIfox测试过程中发现通过网关入口请求某些接口&#xff0c;一段时间后返回错误&#xff0c;查看系统日志发现除了报There is no session with i…

(Java)泛型总结

泛型类 public class Student<E> {private E a;public Student(E a){this.aa;}public void show(){System.out.println(a);} } 泛型方法 public <E> void show(E a){System.out.println(a);} 泛型接口 public interface Inter <T>{void show(T a); } 类…

流程封装与基于加密接口的测试用例设计

接口测试仅仅掌握 Requests 或者其他一些功能强大的库的用法&#xff0c;是远远不够的&#xff0c;还需要具备能根据公司的业务流程以及需求去定制化一个接口自动化测试框架的能力。所以&#xff0c;接下来&#xff0c;我们主要介绍下接口测试用例分析以及通用的流程封装是如何…

USACO12OPEN Balanced Cow Subsets G(meet in the middle)

洛谷P3067 [USACO12OPEN] Balanced Cow Subsets G 题目大意 我们定义一个奶牛集合 S S S是平衡的&#xff0c;当且仅当满足以下两个条件&#xff1a; S S S非空 S S S可以被划分为两个集合 A , B A,B A,B&#xff0c;满足 A A A里的奶牛产量之和等于 B B B里的牛奶产量之和 …

并发编程 -常用并发设计模式

1. 优雅终止线程的设计模式 思考&#xff1a;在一个线程 T1 中如何优雅的终止线程 T2&#xff1f; 错误思路1&#xff1a;使用线程对象的 stop() 方法停止线程 stop 方法会真正杀死线程&#xff0c;如果这时线程锁住了共享资源&#xff0c;那么当它被杀死后就再也没有机会释 …