项目整合OAuth2.0 gitee是第三方登录
OAuth2 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中保证安全性。
扩展:在用户第一次用第三方平台登陆后,绑定你的唯一手机号
更多推荐
已为社区贡献1条内容
所有评论(0)