使用Gitee进行社交登录的流程

使用Gitee进行社交登录

创建Gitee第三方应用流程:

鼠标移动到个人头像上,点击账号设置

点击账号设置,选择左边目录下数据管理的第三方应用

然后选择创建应用

根据要求填写

填写好了上面的要求之后,点击创建应用,这样,在Git上就创建了一个第三方应用,我为谷粒商城创建的第三方应用的信息如下。

 

OpenAPI文档说明

可以在账号设置页面,点击底部的OpenApi查看如何获取Gitee中的信息

比如在API文档中的用户账号下可以根据Accsess_Token获取授权的用户信息

在OAuth文档下提供了 OAuth2.0获取AccessToken的步骤。

谷粒商城实现社交登录流程

1.在前端页面设置一个超链接 ,前端页面的地址要和我们创建的第三方应用中的应用主页要相同。

应用主页:

超链接地址为OAuth2.0文档中的 A

<a href="https://gitee.com/oauth/authorizeclient_id=273de618c9ab38dff104e85d32324311a973a48b333566958c88481edd0bb5e3&redirect_uri=http://auth.gulimall.com/auth2.0/gitee/success&response_type=code">
<img style="width: 50px;height: 18px;" src="https://gitee.com/static/images/logo-black.svg?t=158106664" />
<span>Gitee</span>
</a>

注意:这里的 authorizeclient_idredirect_uri 要跟我们创建的第三方应用中的 Client ID ,应用回调地址 相同。

2.在前端点击超链接后,Gitee会返回给应用回调地址所在的请求一个code,然后我们在后端根据这个code 使用OAuth中的 D 获得 AccessToken。

	@GetMapping("/auth2.0/gitee/success")public String auth2Login(@RequestParam("code") String code, HttpSession session) throws Exception {//根据自己的信息设置valueMap<String, String> map = new HashMap<>();map.put("grant_type","authorization_code");map.put("code",code);map.put("client_id","273de618c9ab38dff104e85d32324311a973a48b333566958c88481edd0bb5e3");map.put("redirect_uri","http://auth.gulimall.com/auth2.0/gitee/success");map.put("client_secret","8b1f1707d35936bcb78479f7596fe7e3ab097ebd615ca57e71c6728d64b5ed6b");//发送请求,得到数据,HttpUtils是我自己的一个工具类,用来发送get、post请求的HttpResponse response = HttpUtils.doPost("https://gitee.com", "/oauth/token", "post", new HashMap<>(), map, new HashMap<>());//得到access_tokenif(response.getStatusLine().getStatusCode()==200){//EntityUtils是org.apache.http.util下的一个工具类String s = EntityUtils.toString(response.getEntity());SocialUser socialUser = JSON.parseObject(s, SocialUser.class);//判断这个用户是否是第一次使用当前社交登录R r = memberFeignService.socialLogin(socialUser);if(r.getCode()==0){//登录成功MemberEntityVo data = r.getData("data", new TypeReference<MemberEntityVo>() {});session.setAttribute(AuthServerConstant.LOGIN_USER,data);
//                log.info("登录成功:用户信息:{}",data.toString());return "redirect:http://gulimall.com";}else{//登录失败return "redirect:http://auth.gulimall.com/login.html";}}else{return "redirect:http://auth.gulimall.com/login.html";}}

3.在 memberFeignService 对应的微服务中使用API文档中的获取用户资料方法,根据AccessToken得到用户的信息。

@PostMapping("/socialLogin")public R socialLogin(@RequestBody memberSocialUser user) throws Exception {MemberEntity memberEntity = memberService.socialLogin(user);return R.ok().put("data",memberEntity);}

 

@Overridepublic MemberEntity socialLogin(memberSocialUser vo) throws Exception {String name="";Map<String,String> map=new HashMap<>();map.put("access_token", vo.getAccess_token());HttpResponse response = HttpUtils.doGet("https://gitee.com", "/api/v5/user", "get", new HashMap<String, String>(), map);if(response.getStatusLine().getStatusCode()==200){String s = EntityUtils.toString(response.getEntity());JSONObject jsonObject = JSON.parseObject(s);int id = (int)jsonObject.get("id");name = (String)jsonObject.get("name");vo.setUid(id+"");}LambdaQueryWrapper<MemberEntity> lqw = new LambdaQueryWrapper<>();lqw.eq(MemberEntity::getSocialUid,vo.getUid());MemberEntity entity = this.getOne(lqw);if(entity!=null){//这个用户已经注册//Access_token存在过期时间,所以每一次登录需要更新Access_tokenMemberEntity update = new MemberEntity();update.setId(entity.getId());update.setAccessToken(vo.getAccess_token());update.setExpiresIn(vo.getExpires_in()+"");baseMapper.updateById(update);entity.setExpiresIn(vo.getExpires_in()+"");entity.setAccessToken(vo.getAccess_token());return entity;}else{//没有就注册MemberEntity memberEntity = new MemberEntity();memberEntity.setAccessToken(vo.getAccess_token());memberEntity.setExpiresIn(vo.getExpires_in()+"");memberEntity.setSocialUid(vo.getUid());memberEntity.setNickname(name);baseMapper.insert(memberEntity);return memberEntity;}}

然后根据用户的UID去数据库中查询,判断用户是否是第一次登录,如果是第一次登录,那么就把用户的数据保存到数据库中。

在登录成功后,将用户的数据返回给调用的微服务。

4.然后就在用户登录微服务中得到登录成功的用户信息,这样社交登录就完成了。

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

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

相关文章

国外企业使用生成式人工智能实例100

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

C#操作sql server之连接sql server数据库

C#是Microsoft公司为.NET Framework推出的重量级语言&#xff0c;和它搭配最完美的数据库无疑就是Microsoft SQL Server了。下面小编就总结了三种连接sql server数据库的方法。 第一种&#xff08;使用SqlConnection实现&#xff09;: 小提示: // 如果连接自己的数据库 可以将…

上位机开发PyQt5(一)【创建窗口、窗口标题、气泡、显示图片和图标、显示文字】

目录 一、 第一个Qt窗口 二、PyQt模块简介 三、窗口标题和气泡 setWindowTitle resize setToolTip 四、标签QLabel显示图片和图标 setPixmap setWindowIcon resize(label.pixmap().size()) 五、标签QLabel显示文字 setText QFont setPointSize setFont set…

Redis - Set 集合

目录 前言 命令 SADD 将一个或者多个元素添加到 set 中 语法 SMEMBERS 获取一个 set 中的所有元素 语法 SISMEMBER 判断⼀个元素在不在 set 中 语法 SCARD 获取 set 中的元素个数 语法 SPOP 从 set 中随机删除并返回⼀个或者多个元素 语法 SMOME 将⼀个元素从源 se…

Python 单例类中设置和获取属性的问题及解决方案

1、问题背景 在编写 Python 代码时&#xff0c;有时需要创建一个单例类&#xff0c;这样就可以在程序中使用该类的唯一实例。为了实现这一点&#xff0c;可以定义一个类&#xff0c;并在其 __new__ 方法中检查该类的实例是否已经存在。如果实例存在&#xff0c;则返回该实例&a…

Rancher-Longhorn-新增磁盘以及卷创建原理和卷副本调度规则

一、添加磁盘-官网指引 重点在于&#xff1a; 1、比如你新增了一块盘&#xff0c;你需要做一下事情&#xff1a; 1、执行 lsblk 能找到你的盘。 2、然后执行 fdisk /dev/sdxx 分区你的盘。 3、然后对于分区部署文件系统&#xff0c; mkfs.xfs 4、然后执行 mount /dev/sdxxx 你…

Redis入门到通关之数据结构解析-SkipList

文章目录 ☃️概述☃️总结 欢迎来到 请回答1024 的博客 &#x1f353;&#x1f353;&#x1f353;欢迎来到 请回答1024的博客 关于博主&#xff1a; 我是 请回答1024&#xff0c;一个追求数学与计算的边界、时间与空间的平衡&#xff0c;0与1的延伸的后端开发者。 博客特色&…

--菱形继承--

#include<iostream> using namespace std;class Animal { public:Animal(){m_Age 0;}int m_Age; };//利用虚继承 解决菱形继承的问题 //继承之前 加上关键字 virtual 变为虚继承 // Animal类称为 虚基类 //羊类 class Sheep:virtual public Animal { public:};//驼类 cl…

基于springboot实现的汽车租赁系统

开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven…

Markdown编辑器的使用

欢迎使用Markdown编辑器 你好&#xff01; 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章&#xff0c;了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持&#x…

一文搞懂 One-Hot Encoding(独热编码)

文章目录 前言 1、独热编码的原理 2、独热编码的分类 3、独热编码的应用 前言 本文将从独热编码的原理、独热编码的分类、独热编码的应用三个方面&#xff0c;来展开介绍独热编码 One-Hot Encoding。 1、独热编码的原理 特征数字化&#xff1a;将分类变量&#xff08;或称为离…

对MAE的解析

一、背景 Masked Autoencoders&#xff08;掩膜自编码器&#xff09;在NLP领域大放异彩&#xff0c;它是去噪自编码器[1]的一种具体实现方式&#xff0c;然而其在视觉领域的研究进展却有所滞后。作者指出了视觉和NLP两个领域中掩膜自编码器的差异&#xff1a; 架构差异&#xf…

【智能算法】成吉思汗鲨鱼优化算法(GKSO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2023年&#xff0c;G Hu等人受到成吉思汗鲨鱼&#xff08;GKS&#xff09;捕食和生存行为启发&#xff0c;提出了成吉思汗鲨鱼优化算法&#xff08;Genghis Khan Shark Optimizer, GKSO&#xff09;…

C# Solidworks二次开发:枚举应用实战(第九讲)

大家好&#xff0c;今天还是介绍我们的枚举应用实战系列。 下面是今天要介绍的枚举&#xff1a; &#xff08;1&#xff09;第一个为swsBearingLoadEndEditError_e&#xff0c;这个枚举值的含义为轴承载荷编辑错误&#xff0c;下面是官方的具体枚举值&#xff1a; MemberDesc…

2024.4.27——LeetCode 高频题复盘

目录 102. 二叉树的层序遍历33. 搜索旋转排序数组121. 买卖股票的最佳时机200. 岛屿数量20. 有效的括号88. 合并两个有序数组141. 环形链表46. 全排列236. 二叉树的最近公共祖先 102. 二叉树的层序遍历 题目链接 Python 方法一 # Definition for a binary tree node. # clas…

Vue开发者工具Vue.js devtools Vue开发者工具安装步骤前端开发工具免费附带教程

下载地址&#xff1a; 链接: https://pan.baidu.com/s/1JaGvhS4NoD8lL07n2ScE9A 密码: 9rfs 安装步骤&#xff1a; 以谷歌浏览器为例 第一步&#xff1a;打开Chrome的拓展程序 如图 第二步&#xff1a; 将下载好的拓展程序拖入即可&#xff0c;如下图 第三步&#xff1a;…

现代永磁同步电机控制原理pdf及全套matlab仿真模型

现代永磁同步电机控制原理pdf及matlab仿真模型。全书包含SVPWM, DTC, Lun, smo, EKF, HFI等经典控制算法。将书中10章节涉及到的模型复原搭建模型。 模型获取链接&#xff1a;现代永磁同步电机控制原理pdf及全套matlab仿真模型

TCP-模拟BS架构通信

简介 bs是通过浏览器进行访问的每次访问都会开启一个短期的socket用来访问服务器的资源 响应报文的格式 服务端 bs架构中的b是浏览器&#xff0c;不需要我们书写&#xff0c;我们只需要书写服务端即可 服务端 public class Server {public static void main(String[] args) {S…

【Docker】docker部署lnmp和wordpress网站

环境准备 docker&#xff1a;192.168.67.30 虚拟机&#xff1a;4核4G systemctl stop firewalld systemctl disable firewalld setenforce 0 安装docker #安装依赖包 yum -y install yum-utils device-mapper-persistent-data lvm2 #设置阿里云镜像 yum-config-manager --add…

【校招VIP】985 211求职策略

目录 一、24届基本结束&#xff0c;数据总结 1. 5成-7成的211-985同学没拿到大厂开发岗&#xff08;用户调查来源&#xff09; 2. 薪资正常在20K-25K&#xff0c;但是招聘量收紧 3.五大银行总行开发岗&#xff0c;进一步收紧 4.为什么往年秋招10底结束&#xff0c;去年去延…