社交登陆
1.OAuth2.0
- 作用:三方认证授权,社交登陆遵循的是oauth2协议,
-
oauth2的认证授权流程
2.gitee三方登陆
-
登陆时序图
3.实现
-
官网文档
https://gitee.com/api/v5/oauth_doc#/
1.gitee创建授权应用
2.前端代码请求到gitee授权页
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;
}