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

打印 上一主题 下一主题

主题 831|帖子 831|积分 2493

使用Gitee进行社交登录

创建Gitee第三方应用流程:

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

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

然后选择创建应用

根据要求填写


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

 
OpenAPI文档阐明

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


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


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

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

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

超链接地址为OAuth2.0文档中的 A
  1. <a href="https://gitee.com/oauth/authorizeclient_id=273de618c9ab38dff104e85d32324311a973a48b333566958c88481edd0bb5e3&redirect_uri=http://auth.gulimall.com/auth2.0/gitee/success&response_type=code">
  2. <img style="width: 50px;height: 18px;" src="https://gitee.com/static/images/logo-black.svg?t=158106664" />
  3. <span>Gitee</span>
  4. </a>
复制代码
注意:这里的 authorizeclient_id 、redirect_uri 要跟我们创建的第三方应用中的 Client ID ,应用回调地址 雷同。

2.在前端点击超链接后,Gitee会返回给应用回调地址地点的请求一个code,然后我们在后端根据这个code 使用OAuth中的 D 获得 AccessToken。
  1.         @GetMapping("/auth2.0/gitee/success")
  2.     public String auth2Login(@RequestParam("code") String code, HttpSession session) throws Exception {
  3.         //根据自己的信息设置value
  4.         Map<String, String> map = new HashMap<>();
  5.         map.put("grant_type","authorization_code");
  6.         map.put("code",code);
  7.         map.put("client_id","273de618c9ab38dff104e85d32324311a973a48b333566958c88481edd0bb5e3");
  8.         map.put("redirect_uri","http://auth.gulimall.com/auth2.0/gitee/success");
  9.         map.put("client_secret","8b1f1707d35936bcb78479f7596fe7e3ab097ebd615ca57e71c6728d64b5ed6b");
  10.         //发送请求,得到数据,HttpUtils是我自己的一个工具类,用来发送get、post请求的
  11.         HttpResponse response = HttpUtils.doPost("https://gitee.com", "/oauth/token", "post", new HashMap<>(), map, new HashMap<>());
  12.         //得到access_token
  13.         if(response.getStatusLine().getStatusCode()==200){
  14.             //EntityUtils是org.apache.http.util下的一个工具类
  15.             String s = EntityUtils.toString(response.getEntity());
  16.             SocialUser socialUser = JSON.parseObject(s, SocialUser.class);
  17.             //判断这个用户是否是第一次使用当前社交登录
  18.             R r = memberFeignService.socialLogin(socialUser);
  19.             
  20.             if(r.getCode()==0){
  21.                 //登录成功
  22.                 MemberEntityVo data = r.getData("data", new TypeReference<MemberEntityVo>() {
  23.                 });
  24.                 session.setAttribute(AuthServerConstant.LOGIN_USER,data);
  25. //                log.info("登录成功:用户信息:{}",data.toString());
  26.                 return "redirect:http://gulimall.com";
  27.             }else{
  28.                 //登录失败
  29.                 return "redirect:http://auth.gulimall.com/login.html";
  30.             }
  31.         }else{
  32.             return "redirect:http://auth.gulimall.com/login.html";
  33.         }
  34.     }
复制代码
3.在 memberFeignService 对应的微服务中使用API文档中的获取用户资料方法,根据AccessToken得到用户的信息。
  1.         @PostMapping("/socialLogin")
  2.     public R socialLogin(@RequestBody memberSocialUser user) throws Exception {
  3.         MemberEntity memberEntity = memberService.socialLogin(user);
  4.         return R.ok().put("data",memberEntity);
  5.     }
复制代码
 
  1.     @Override
  2.     public MemberEntity socialLogin(memberSocialUser vo) throws Exception {
  3.         String name="";
  4.         Map<String,String> map=new HashMap<>();
  5.         map.put("access_token", vo.getAccess_token());
  6.         HttpResponse response = HttpUtils.doGet("https://gitee.com", "/api/v5/user", "get", new HashMap<String, String>(), map);
  7.         if(response.getStatusLine().getStatusCode()==200){
  8.             String s = EntityUtils.toString(response.getEntity());
  9.             JSONObject jsonObject = JSON.parseObject(s);
  10.             int id = (int)jsonObject.get("id");
  11.             name = (String)jsonObject.get("name");
  12.             vo.setUid(id+"");
  13.         }
  14.         LambdaQueryWrapper<MemberEntity> lqw = new LambdaQueryWrapper<>();
  15.         lqw.eq(MemberEntity::getSocialUid,vo.getUid());
  16.         MemberEntity entity = this.getOne(lqw);
  17.         if(entity!=null){
  18.             //这个用户已经注册
  19.             //Access_token存在过期时间,所以每一次登录需要更新Access_token
  20.             MemberEntity update = new MemberEntity();
  21.             update.setId(entity.getId());
  22.             update.setAccessToken(vo.getAccess_token());
  23.             update.setExpiresIn(vo.getExpires_in()+"");
  24.             baseMapper.updateById(update);
  25.             entity.setExpiresIn(vo.getExpires_in()+"");
  26.             entity.setAccessToken(vo.getAccess_token());
  27.             return entity;
  28.         }else{
  29.             //没有就注册
  30.             MemberEntity memberEntity = new MemberEntity();
  31.             memberEntity.setAccessToken(vo.getAccess_token());
  32.             memberEntity.setExpiresIn(vo.getExpires_in()+"");
  33.             memberEntity.setSocialUid(vo.getUid());
  34.             memberEntity.setNickname(name);
  35.             baseMapper.insert(memberEntity);
  36.             return memberEntity;
  37.         }
  38.     }
复制代码
然后根据用户的UID去数据库中查询,判定用户是否是第一次登录,如果是第一次登录,那么就把用户的数据生存到数据库中。
在登录乐成后,将用户的数据返回给调用的微服务。
4.然后就在用户登录微服务中得到登录乐成的用户信息,这样社交登录就完成了。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

魏晓东

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表