day14 社交登陆

社交登陆

image-20221029145652770

1.OAuth2.0

  • 作用:三方认证授权,社交登陆遵循的是oauth2协议,

image-20221029145626456

  • oauth2的认证授权流程

    image-20221029150420697

2.gitee三方登陆

  • 登陆时序图

    image-20221029163440934

3.实现

  • 官网文档

    https://gitee.com/api/v5/oauth_doc#/

1.gitee创建授权应用

image-20221110212134535

image-20221110212201239

image-20221110212237158

2.前端代码请求到gitee授权页

image-20221110212402077

3.授权成功后回调后台服务

    @GetMapping("/oauth2.0/gitee/success")
    public String oauth(@RequestParam("code") String code) throws IOException {
        // Step2:通过Authorization Code获取Access Token
        String tokenUrl = "https://gitee.com/oauth/token?grant_type=authorization_code" +
                "&client_id=" + CLIENTID +
                "&client_secret=" + CLIENTSECRET +
                "&code=" + code +
                "&redirect_uri=" + URL;
        JSONObject tokenJson = getAccessToken(tokenUrl);
        if (Objects.nonNull(tokenJson)) {
            String userUrl = "https://gitee.com/api/v5/user?access_token=" + tokenJson.get("access_token");
            JSONObject userInfo = getUserInfo(userUrl);
            if (Objects.isNull(userInfo)){
                log.info("根据token:{}获取用户信息为空",tokenJson.get("access_token"));
                return  "redirect:http://auth.dreammall.com/login.html";
            }
            SocialUser socialUser = JSONObject.parseObject(tokenJson.toJSONString(), SocialUser.class);
            socialUser.setUserInfo(userInfo);
            R oauthLogin = memberFeignService.oauthLogin(socialUser);
            // 更新或者注册成功
            if (oauthLogin.getCode() == 0) {
                MemberResponseVo data = oauthLogin.getData("data", new TypeReference<MemberResponseVo>() {});
                log.info("登录成功:用户信息:{}",data.toString());
                //2、登录成功跳回首页
                return "redirect:http://dreammall.com";
            }else {
                return  "redirect:http://auth.dreammall.com/login.html";
            }
        } else {
            return "redirect:http://auth.dreammall.com/login.html";
        }
    }

    public static JSONObject getAccessToken(String url) throws IOException {
        HttpClient client = HttpClients.createDefault();
        HttpPost httpPost = new HttpPost(url);
        HttpResponse response = client.execute(httpPost);
        HttpEntity entity = response.getEntity();
        if (null != entity) {
            String result = EntityUtils.toString(entity, "UTF-8");
            return JSONObject.parseObject(result);
        }
        httpPost.releaseConnection();
        return null;
    }

    public static JSONObject getUserInfo(String url) throws IOException {
        JSONObject jsonObject = null;
        CloseableHttpClient client = HttpClients.createDefault();

        HttpGet httpGet = new HttpGet(url);
        HttpResponse response = client.execute(httpGet);
        HttpEntity entity = response.getEntity();

        if (entity != null) {
            String result = EntityUtils.toString(entity, "UTF-8");
            jsonObject = JSONObject.parseObject(result);
        }

        httpGet.releaseConnection();
        return jsonObject;
    }
    /**
     * 三方注册用户
     * @param socialUser
     * @return
     */
    @PostMapping(value = "/member/member/oauth2/login")
    R oauthLogin(@RequestBody SocialUser socialUser);
   @PostMapping(value = "/oauth2/login")
    public R oauthLogin(@RequestBody SocialUser socialUser) {
        Member member = memberService.oauthLogin(socialUser);
        if (member != null) {
            return R.ok().setData(member);
        } else {
            return R.error(BizCodeEnum.LOGINACCT_PASSWORD_EXCEPTION.getCode(), BizCodeEnum.LOGINACCT_PASSWORD_EXCEPTION.getMsg());
        }
    }

    public Member oauthLogin(SocialUser socialUser) {
        // 判断数据库是否有这个用户
        JSONObject userInfo = socialUser.getUserInfo();
        String uid = String.valueOf((Integer) userInfo.get("id"));
        String accessToken = (String) userInfo.get("access_token");
        String expiresIn = (String) userInfo.get("expires_in");
        String name = (String) userInfo.get("name");
        Member member = baseMapper.selectOne(Wrappers.<Member>lambdaQuery().eq(Member::getOauthUid, uid));
        if (Objects.nonNull(member)) {
            member.setAccessToken(accessToken);
            member.setExpiresIn(expiresIn);
            baseMapper.updateById(member);
        } else {
            member = new Member();
            member.setNickname(name);
            member.setGender(1);
            member.setCreateTime(new Date());
            member.setOauthUid(uid);
            member.setAccessToken(socialUser.getAccess_token());
            member.setExpiresIn(socialUser.getExpires_in());
            baseMapper.insert(member);
        }
        return member;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值