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

news2024/11/16 12:31:49

使用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 {
        //根据自己的信息设置value
        Map<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_token
        if(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);
    }

 


    @Override
    public 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_token
            MemberEntity 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.coloradmin.cn/o/1620160.html

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

相关文章

孙中亮:北斗三十周年,看北斗芯片高质量发展历程和方向

1994年1月10日&#xff0c;北斗一号建设正式启动&#xff0c;党中央决策建设独立自主的北斗卫星导航系统。2020年7月31日&#xff0c;北斗三号全球卫星导航系统正式开通&#xff0c;标志着北斗系统进入全球化发展新阶段。随着2024年的到来&#xff0c;北斗系统建设已走过栉风沐…

【力扣 Hot100 | 第五天】4.20(回文链表)

1.回文链表 1.1题目 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例一&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true示例二&#xff1a; 输入…

HOOPS Commuicator:基于Web的交互式2D/3D图形轻量化引擎

在当前数字化时代&#xff0c;Web基础的3D应用程序正在成为行业标准&#xff0c;尤其是在工程和制造领域。Tech Soft 3D公司旗下的HOOPS Communicator正是针对这一需求设计的高级解决方案&#xff0c;提供了一套全面的工具&#xff0c;旨在帮助开发者构建复杂的3D工程应用程序。…

【学习笔记二十五】EWM PPF自动WT后台配置和前台展示

一、概述 SAP EWM(Extended Warehouse Management)模块中的PPF(Post Processing Framework)是一个用于执行通用功能和流程的工具。PPF为SAP EWM提供了一个统一的接口,用于触发各种动作,例如打印托盘标签、交货单、拣选票或发送消息和传真。这些动作在特定条件满足时生成,…

Pasta:HHE Optimized Stream Cipher

参考文献&#xff1a; [Dae95] Daemen J .Cipher and hash function design strategies based on linear and differential cryptanalysis[J].Doctoral Dissertation K.u.leuven, 1995.[GPP11] Guo J, Peyrin T, Poschmann A. The PHOTON family of lightweight hash function…

【笔试】03

FLOPS FLOPS 是 Floating Point Operations Per Second 的缩写&#xff0c;意为每秒浮点运算次数。它是衡量计算机性能的指标&#xff0c;特别是用于衡量计算机每秒能够执行多少浮点运算。在高性能计算领域&#xff0c;FLOPS 被广泛用来评估超级计算机、CPU、GPU 和其他处理器…

日志分析简单总结

1、分析日志的目的 误报&#xff1a;不是攻击而上报成攻击 漏报&#xff1a;是攻击而没有防御的情况 日志分析可以判断是否误判或者漏判&#xff0c;可以溯源攻击行为 在护网作为防守方必备的技能&#xff08;分析NGAF和态势感知&#xff0c;发现异常&#xff09; 2、攻击出现…

芯科科技大大简化面向无电池物联网的能量采集产品的开发

芯科科技推出其迄今最高能量效率且支持能量采集功能的无线SoC 中国&#xff0c;北京 – 2024年4月22日 – 致力于以安全、智能无线连接技术&#xff0c;建立更互联世界的全球领导厂商Silicon Labs&#xff08;亦称“芯科科技”&#xff0c;NASDAQ&#xff1a;SLAB&#xff09;…

一个联合均值与方差模型的R包——dglm

目录 一、引言二、包的安装与载入三、模拟例子3.1 数据生成3.2 数据查看3.3 模型估计参数 一、引言 在 R 语言中&#xff0c;dglm 包是用于拟合双参数广义线性模型&#xff08;Double Generalized Linear Models&#xff0c;简称 DGLMs&#xff09;的一个工具。这类模型允许同…

fakak详解(2)

Kafka和Flume整合 Kafka与flume整合流程 Kafka整合flume流程图 flume主要是做日志数据(离线或实时)地采集。 图-21 数据处理 图-21显示的是flume采集完毕数据之后&#xff0c;进行的离线处理和实时处理两条业务线&#xff0c;现在再来学习flume和kafka的整合处理。 配置fl…

centos7使用源码安装方式redis

安装编译源码的工具gcc yum install -y gcc下载源码 源码下载地址 https://download.redis.io/releases/ 注意事项 不建议安装最新版本redis&#xff0c;所以我这里选择6.2.6版本 下载 wget https://download.redis.io/releases/redis-6.2.6.tar.gz解压 tar -zxvf redis-…

基于表面法线法的二维人脸图构建三维人脸模型matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ............................................................................for j 1 : …

Python基础进阶语法

目录&#xff1a; 一、基础语法二、进阶语法 一、基础语法 二、进阶语法 1、列表推导式运用 解析&#xff1a;先循环1到10内的数字&#xff0c;然后过滤大于5的数&#xff0c;赋值到new_list数组中进行打印结果。

数字信号处理操作教程_音频解码:3-8 G711A音频解码实验

一、实验目的 学习G711音频的格式和G711A音频解码的原理&#xff0c;并实现将BIT格式解码为PCM格式。 二、实验原理 G711 G711是国际电信联盟订定出来的一套语音压缩标准&#xff0c;主要用于电话。它主要用脉冲编码调制对音频采样&#xff0c;采样率为8k每秒。它利用一个 …

VUE2版本的仿微信通讯录侧滑列表

<template><!-- Vue模板部分 --><div><div v-for"(group, index) in groupedArray" :key"index" ref"indexcatch"><h2>{{ letter[index] }}</h2><ul><li v-for"item in group" :key&quo…

什么因素可以影响到代理IP稳定性?爬虫代理IP有哪些作用?

一、什么因素可以影响到代理IP稳定性 代理IP的稳定性受到多种因素的影响&#xff0c;以下是一些主要的因素&#xff1a; 代理IP的质量&#xff1a;不同的代理IP提供商提供的代理IP质量参差不齐&#xff0c;一些低质量的代理IP可能经常出现连接问题或速度慢的情况&#xff0c;…

Day:动态规划 LeedCode 123.买卖股票的最佳时机III 188.买卖股票的最佳时机IV

123. 买卖股票的最佳时机 III 给定一个数组&#xff0c;它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 注意&#xff1a;你不能同时参与多笔交易&#xff08;你必须在再次购买前出售掉之前的股票&a…

解码数据世界:统计学入门与应用指南

引言 统计学可以被定义为研究数据的科学&#xff0c;它涉及到数据的收集、分析、解释和呈现。其目标是从数据中提取有意义的信息&#xff0c;并使用这些信息来做出推断与决策。 统计学主要分别以下几个主要领域&#xff1a; 描述性统计&#xff1a;使用图表、图形和其他工具…

C++之入门

文章目录 1、前言2、C的关键字2.1C语言32关键字2.2C关键字(63个) 3、命名空间4、输入输出(cout、cin)4、缺省参数5、函数重载6 引用6.1 引用的定义6.2 引用的特性6.3引用的使用场景6.4 实际例子6.5、总结 7、内联函数8、auto关键字9、nullptr关键字 1、前言 C语言是结构化和模…

【声呐仿真】学习记录0-服务器配置docker、ros环境

【声呐仿真】学习记录0-服务器配置docker、ros环境 前言一、~~0.设置mobaXterm~~1.拉取镜像2.服务器开启xhost&#xff0c;可视化&#xff08;rviz、gazebo&#xff09;3.创建容器&#xff0c;挂载数据卷4.测试宿主机与容器数据是否同步5.测试5.0测试xclock5.1测试ros小乌龟5.2…