✅P223_商城业务-认证服务-社交登录完成
2024/2/14大约 3 分钟
Access_Token实体类
根据以前获取到的access_token的json数据,封装access_token的实体类
微博返回VO封装
cfmall-auth-server/src/main/java/com/gyz/cfmall/vo/WeiboUser.java
@Data
@ToString
public class WeiboUser {
private String access_token;
private String remind_in;
private long expires_in;
private String uid;
private String isRealName;
}
Gitee返回VO封装
cfmall-auth-server/src/main/java/com/gyz/cfmall/vo/SocialUser.java
package com.gyz.cfmall.vo;
import lombok.Data;
@Data
public class SocialUser {
private String access_token;
private long expires_in;
private String token_type;
private String refresh_token;
private String scope;
private String created_at;
/**
* gitee返回access_token的json信息没有唯一值参数,因此加个uuid字段
*/
private String uuid;
}
会员服务处理社交登录
调整“ums_member”表结构
表ums_member
添加字段
social_uid
:社交账号ID、access_token
:社交账号Token、expires_in
:Token过期时间
MemberEntity添加字段
cfmall-member/src/main/java/com/gyz/cfmall/member/entity/MemberEntity.java
/**
* 社交登录UID
*/
private String socialUid;
/**
* 社交登录TOKEN
*/
private String accessToken;
/**
* 社交登录过期时间
*/
private long expiresIn;
登录接口
Gitee实现
cfmall-member/src/main/java/com/gyz/cfmall/member/controller/MemberController.java
@Autowired
private MemberService memberService;
@PostMapping("/oauth2/login")
public R oauthLogin(@RequestBody SocialUser socialUser) throws Exception {
MemberEntity memberEntity = memberService.oauthLogin(socialUser);
if (memberEntity != null) {
return R.ok().put("data", memberEntity);
}
return R.error(BizCodeEnum.LOGINACCT_PASSWORD_EXCEPTION.getCode(), BizCodeEnum.LOGINACCT_PASSWORD_EXCEPTION.getMessage());
}
cfmall-member/src/main/java/com/gyz/cfmall/member/service/impl/MemberServiceImpl.java
@Override
public MemberEntity oauthLogin(SocialUser socialUser) throws Exception {
//具有登录和注册逻辑
String uid = socialUser.getUuid();
//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.setAccessToken(socialUser.getAccess_token());
update.setExpiresIn(socialUser.getExpires_in());
this.baseMapper.updateById(update);
memberEntity.setAccessToken(socialUser.getAccess_token());
memberEntity.setExpiresIn(socialUser.getExpires_in());
return memberEntity;
} else {
//2、没有查到当前社交用户对应的记录我们就需要注册一个
MemberEntity register = new MemberEntity();
//3、查询当前社交用户的社交账号信息(昵称、性别等)
Map<String, String> querys = new HashMap<>();
querys.put("access_token", socialUser.getAccess_token());
querys.put("page", String.valueOf(1));
querys.put("per_page", String.valueOf(10));
querys.put("admin", String.valueOf(true));
//TODO:查询当前社交用户授权用户所属的企业。 参见: Gitee OpenAPI->API文档->动态通知->列出用户的公开动态
HttpResponse response = HttpUtils.doGet("https://gitee.com", "/api/v5/user/enterprises", "get", new HashMap<String, String>(), querys);
if (response.getStatusLine().getStatusCode() == 200) {
//查询成功
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(socialUser.getUuid());
register.setAccessToken(socialUser.getAccess_token());
register.setExpiresIn(socialUser.getExpires_in());
//把用户信息插入到数据库中
this.baseMapper.insert(register);
}
return register;
}
}
微博实现
cfmall-member/src/main/java/com/gyz/cfmall/member/controller/MemberController.java
@Autowired
private MemberService memberService;
@PostMapping("/oauth2/weibo/login")
public R oauth2Login(@RequestBody WeiboUser weiboUser) throws Exception {
MemberEntity memberEntity = memberService.oauth2Login(weiboUser);
if (memberEntity != null) {
return R.ok().put("data", memberEntity);
}
return R.error(BizCodeEnum.LOGINACCT_PASSWORD_EXCEPTION.getCode(), BizCodeEnum.LOGINACCT_PASSWORD_EXCEPTION.getMessage());
}
cfmall-member/src/main/java/com/gyz/cfmall/member/service/impl/MemberServiceImpl.java
@Override
public MemberEntity oauth2Login(WeiboUser weiboUser) throws Exception{
//具有登录和注册逻辑
String uid = weiboUser.getUid();
//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.setAccessToken(weiboUser.getAccess_token());
update.setExpiresIn(weiboUser.getExpires_in());
this.baseMapper.updateById(update);
memberEntity.setAccessToken(weiboUser.getAccess_token());
memberEntity.setExpiresIn(weiboUser.getExpires_in());
return memberEntity;
} else {
//2、没有查到当前社交用户对应的记录我们就需要注册一个
MemberEntity register = new MemberEntity();
//3、查询当前社交用户的社交账号信息(昵称、性别等)
Map<String,String> query = new HashMap<>();
query.put("access_token",weiboUser.getAccess_token());
query.put("uid",weiboUser.getUid());
HttpResponse response = HttpUtils.doGet("https://api.weibo.com", "/2/users/show.json", "get", new HashMap<String, String>(), query);
if (response.getStatusLine().getStatusCode() == 200) {
//查询成功
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(weiboUser.getUid());
register.setAccessToken(weiboUser.getAccess_token());
register.setExpiresIn(weiboUser.getExpires_in());
//把用户信息插入到数据库中
this.baseMapper.insert(register);
}
return register;
}
}