Gitee是不需要网站域名认证即可申请的Oautho2.0第三方平台。

Gitee官方:Gitee OAuth 文档

接下来是我项目中使用的场景:登录可使用Gitee登录,并且第一次使用Gitee帐号登录会进行注册。

登录页面:跳转href看官方文档来写,授权之后,会根据你gitee设置的回调地址再去访问那个路径

		<li>
							<a href="https://gitee.com/oauth/authorize?client_id=985615345f500db65decd461ef31ab1013c0edf5435255063590f9a0f9bb4d10&redirect_uri=http://auth.gulimall.com/oauth2.0/gitee/success&response_type=code">
								<img style="width: 25px;height: 18px" src="/static/login/JD_img/gitee.jpg" /><span>  gitee</span>
							</a>

						</li>
 @GetMapping("/oauth2.0/gitee/success")
    public String gitee(@RequestParam("code") String code, HttpSession session) throws Exception {
        String url = "https://gitee.com/oauth/token?grant_type=authorization_code&client_id=你自己的id&redirect_uri=http://auth.gulimall.com/oauth2.0/gitee/success&client_secret=你自己的密码&code=" + code;
        HttpClient httpClient = HttpClientBuilder.create().build();
        HttpPost httpPost = new HttpPost(url);
        HttpResponse response = httpClient.execute(httpPost);
        //2、处理
        if (response.getStatusLine().getStatusCode() == 200) {
            //获取到accessToken

            String json = EntityUtils.toString(response.getEntity());
            System.out.println("获取到的token为:" + json);
            JSONObject jsonObject = JSON.parseObject(json);
            String access_token = jsonObject.getString("access_token");
            System.out.println("获取到的access_token:" + access_token);


            //gitee还需要再去请求user去获取数据
//            GiteeUser giteeUser =  giteeComponent.getGiteeUser(json);
            String urluser = "https://gitee.com/api/v5/user?access_token=" + access_token;
            HttpClient httpClientUser = HttpClientBuilder.create().build();
            HttpGet httpPostUser = new HttpGet(urluser);           //记得用httpGet请求,否则会405拒绝请求
            HttpResponse responseUser = httpClientUser.execute(httpPostUser);

                GiteeUser giteeUser = new GiteeUser();
                String user = EntityUtils.toString(responseUser.getEntity());
                System.out.println("gitee用户信息"+user);

            JSONObject jsonObjectUser = JSON.parseObject(user);
            String id = jsonObjectUser.getString("id");
            System.out.println(id);
            giteeUser.setId(id);
            String name = jsonObjectUser.getString("name");
            System.out.println(name);
            giteeUser.setName(name);
            String bio = jsonObjectUser.getString("bio");
            System.out.println(bio);
            giteeUser.setBio(bio);

                //知道当前是哪个社交用户登录成功
                //1、当前用户如果是第一次进网站,就自动注册进来(为当前社交用户生成一个会员信息账号,以后这个社交账号就对应指定的会员)
                //登录或者注册这个社交用户
                R r = memberFeignService.oauth2Login(giteeUser);
                if (r.getCode() == 0) {
                    MemberRespVo memberRespVo = r.getData(new TypeReference<MemberRespVo>() {
                    });
                    System.out.println("登录成功,用户信息:" + memberRespVo);
                    log.info("登录成功,用户信息:" + memberRespVo);
                    //TODO 1、默认发的令牌 session=dadas,作用域只是当前域,(解决子域与父域session共享问题)
                    //TODO 2、使用json的序列化方式来序列化对象数据到redis中
                    session.setAttribute(AuthServerConstant.SESSION_LOGIN_KEY, memberRespVo);
                    //2、登录成功就跳回首页
                    return "redirect:http://gulimall.com";
                } else {
                    return "redirect:http://auth.gulimall.com/login.html";
                }
            } else {
                return "redirect:http://gulimall.com/login.html";
            }

        }
    

值得注意的是:gitee授权之后会给你一个token,你要拿到token里面的access_token去找user表里的信息再去使用,至于user表里面有什么信息,你可以先去网页上访问看一下json数据,记得gitee授权越多能访问到的数据也越多!

我这里是controller层将获取到的user信息封装了然后调用了远程服务再去注册到自己的用户表中

  @Override
    public MemberEntity login(GiteeUser giteeUser) throws Exception {

        //具有登录和注册逻辑
        System.out.println("id  :"+giteeUser.getId());
        System.out.println("name  :"+giteeUser.getName());
        System.out.println("bio  :"+giteeUser.getBio());

        String uid = giteeUser.getId();

        //1、判断当前社交用户是否已经登录过系统
        MemberEntity memberEntity = this.baseMapper.selectOne(new QueryWrapper<MemberEntity>().eq("social_uid", uid));

        if (memberEntity != null) {
            //这个用户已经注册过
            //更新用户的访问令牌的时间和access_token
            MemberEntity update = new MemberEntity();
            update.setId(memberEntity.getId());
            update.setSocialName(giteeUser.getName());
            update.setSocialBio(giteeUser.getBio());
            this.baseMapper.updateById(update);

            memberEntity.setSocialName(giteeUser.getName());
            memberEntity.setSocialBio(giteeUser.getBio());
            return memberEntity;
        } else {
            //2、没有查到当前社交用户对应的记录我们就需要注册一个
            MemberEntity register = new MemberEntity();
            //3、查询当前社交用户的社交账号信息(昵称、性别等)
//            Map<String,String> query = new HashMap<>();
//            query.put("access_token",giteeUser.getAccess_token());
//            query.put("uid",giteeUser.getUid());
//            HttpResponse response = HttpUtils.doGet("https://api.weibo.com", "/2/users/show.json", "get", new HashMap<String, String>(), query);


            //查询成功
//            String json = EntityUtils.toString(response.getEntity());
//            JSONObject jsonObject = JSON.parseObject(json);
//            String name = jsonObject.getString("name");
//            String gender = jsonObject.getString("gender");
//            String profileImageUrl = jsonObject.getString("profile_image_url");

//            register.setNickname(name);
//            register.setGender("m".equals(gender) ? 1 : 0);
//            register.setHeader(profileImageUrl);
            register.setCreateTime(new Date());
            register.setSocialUid(giteeUser.getId());
            register.setSocialName(giteeUser.getName());
            register.setSocialBio(giteeUser.getBio());

            //把用户信息插入到数据库中
            this.baseMapper.insert(register);


            return register;
        }
    }

根据你的需求可以去获取更多的数据存放到数据库中,也可以存放过期时间和token到redis中保证安全性。

扩展:在用户第一次用第三方平台登陆后,绑定你的唯一手机号

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐