项目整合OAuth2.0 gitee是第三方登录

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中保证安全性。

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

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
以下是使用Gitee第三方登录的步骤: 1. 首先,你需要在Gitee官网上注册并登录账号。 2. 在Gitee开发者中心创建一个OAuth2应用。具体步骤如下: a. 进入开发者中心:https://gitee.com/oauth/applications b. 点击“新建OAuth2应用”按钮。 c. 填写应用信息,包括应用名称、应用描述、回调地址等。 d. 创建成功后,你将获得一个Client ID和Client Secret,这些信息将在后续的登录过程中用到。 3. 在你的网站或应用程序中添加Gitee第三方登录功能。具体步骤如下: a. 在用户点击登录按钮时,跳转到Gitee的授权页面,授权页面的URL如下: ``` https://gitee.com/oauth/authorize?client_id=YOUR_CLIENT_ID&redirect_uri=YOUR_REDIRECT_URI&response_type=code ``` 其中,YOUR_CLIENT_ID是你在第2步中获得的Client ID,YOUR_REDIRECT_URI是你的网站或应用程序的回调地址。 b. 用户在Gitee授权页面上授权后,将被重定向到你的网站或应用程序的回调地址,并附带一个授权码。 c. 使用授权码向Gitee请求访问令牌。请求URL如下: ``` https://gitee.com/oauth/token?grant_type=authorization_code&code=YOUR_CODE&client_id=YOUR_CLIENT_ID&redirect_uri=YOUR_REDIRECT_URI&client_secret=YOUR_CLIENT_SECRET ``` 其中,YOUR_CODE是第2步中获得的授权码,YOUR_CLIENT_ID和YOUR_REDIRECT_URI同上,YOUR_CLIENT_SECRET是你在第2步中获得的Client Secret。 d. Gitee将返回一个访问令牌,你可以使用该令牌向Gitee请求用户信息。 4. 使用访问令牌向Gitee请求用户信息。请求URL如下: ``` https://gitee.com/api/v5/user?access_token=YOUR_ACCESS_TOKEN ``` 其中,YOUR_ACCESS_TOKEN是第3步中获得的访问令牌。 返回的用户信息包括用户名、头像、邮箱等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JagTom

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值