使用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.然后就在用户登录微服务中得到登录成功的用户信息,这样社交登录就完成了。

相关推荐
jonyleek3 天前
JVS开源框架:工作流引擎代理中心的设计挑战与实现方案
java·gitee·开源·github·软件需求
Sheljoee.4 天前
【GitHub】基础入门步骤
开发语言·人工智能·python·单片机·gitee·github·嵌入式实时数据库
影阴6 天前
如何将本地项目上传至Gitee仓库(详细教程)
gitee
loveLifeLoveCoding6 天前
gitee 使用 webhoot 触发 Jenkins 自动构建
运维·gitee·jenkins
子蛟7 天前
Android Studio 安装过程
android·gitee·android studio
南鸢1.08 天前
IntelliJ IDEA 中上传项目到 Gitee 的完整指南
java·git·gitee·idea
一个很帅的帅哥9 天前
Mac在Typora配置PicGo图床,以github为例
macos·gitee·github·typora·mac·图床
謬熙9 天前
GitHub、Gitee、GitLab介绍
gitee·gitlab·github
..过云雨14 天前
gitee建立/取消关联仓库
gitee
寰梦15 天前
上传Gitee仓库流程图
gitee·流程图