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

使用Gitee进行社交登录

创建Gitee第三方应用流程:

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

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

然后选择创建应用

根据要求填写

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

OpenAPI文档说明

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

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

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

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

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

应用主页:

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

html 复制代码
<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。

java 复制代码
	@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得到用户的信息。

java 复制代码
	@PostMapping("/socialLogin")
    public R socialLogin(@RequestBody memberSocialUser user) throws Exception {
        MemberEntity memberEntity = memberService.socialLogin(user);
        return R.ok().put("data",memberEntity);
    }
java 复制代码
    @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.然后就在用户登录微服务中得到登录成功的用户信息,这样社交登录就完成了。

相关推荐
不悔哥1 天前
如何基于gitee新建仓库
gitee
艾莉丝努力练剑1 天前
【Git:多人协作】Git多人协作实战:从同分支到多分支工作流
服务器·c++·人工智能·git·gitee·centos·项目管理
徐同保2 天前
如何使用GitKraken把git项目迁移到另一个平台,并保存所有提交记录,例如把github上的项目,迁移到gitee
git·gitee·github
TTGGGFF3 天前
开源项目分享 : Gitee热榜项目 2025-11-24 日榜
gitee·开源
筱顾大牛3 天前
IDEA使用Gitee来创建远程仓库
java·gitee·intellij-idea
sulikey3 天前
从入门到精通:如何自己编写高质量的 .gitignore(面向工程实践)
git·gitee·编辑器·gitlab·github·gitignore·gitattributes
打小就很皮...3 天前
React 项目开发指南:脚手架搭建、Axios 封装与 Gitee 远程仓库配置
react.js·gitee·axios
little_xianzhong3 天前
把一个本地项目导入gitee创建的仓库中
大数据·elasticsearch·gitee
代码AC不AC7 天前
【Linux】版本控制器Git
linux·git·gitee
TTGGGFF8 天前
开源项目分享 : Gitee热榜项目 2025-11-19 日榜
gitee·开源