Bootstrap

谷粒商城gitee社交登录流程

1.登录gitee,进入个人主页,申请平台的API

在这里插入图片描述

![在这里插入图片描述](https://img-blog.csdnimg.cn/f970b15b42384e12ba862c9445c828b3.png
这里的填写第一个我也不知道有什么用
第二个是同意或者拒绝授权的路径

在这里插入图片描述

可以模拟请求
在这里插入图片描述

这个是授权界面的地址,放在前端跳转的,直接复制
在这里插入图片描述

接下里就是Java代码了
Controller

@Slf4j
@Controller
public class OAuth2Controller {

    @Autowired
    MemberFeignService memberFeignService;

    @GetMapping("/oauth2.0/gitee/success")
    public String gitee(@RequestParam("code") String code, HttpSession session) throws Exception {
        Map<String,String> header = new HashMap<>();
        Map<String,String> query = new HashMap<>();



        Map<String,String> map = new HashMap<>();
        map.put("client_id","????????????");
        map.put("client_secret","??????????");
        map.put("grant_type","authorization_code");
        map.put("redirect_uri","http://auth.gulimall.com/oauth2.0/gitee/success");
        map.put("code",code);
        //1、根据code换取accessToken;
        HttpResponse response = com.atguigu.common.utils.HttpUtils.doPost("https://gitee.com", "/oauth/token", "post", header, query, map);
        System.out.println(response.getStatusLine().getStatusCode() );
        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里的属性没有那么多,该类参照了其它博主,我只get了id-----uid和name----username与表对应
vo

import lombok.Data;

@Data
public class GiteeUser {

   private String id;
   private String name;
   private String bio;
}


member里的业务方法

  @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.setUsername(giteeUser.getName());
            this.baseMapper.updateById(update);

            memberEntity.setUsername(giteeUser.getName());
            return memberEntity;
        } else {
            //2、没有查到当前社交用户对应的记录我们就需要注册一个
            MemberEntity register = new MemberEntity();

            register.setCreateTime(new Date());
            register.setSocialUid(giteeUser.getId());
            register.setUsername(giteeUser.getName());


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


            return register;

        }
    }

自己在跟着视频整一个feign调用,复制一个memberVo和把自己的id和密钥换下就行可以运行了

;