1.登录gitee,进入个人主页,申请平台的API
这里的填写第一个我也不知道有什么用
第二个是同意或者拒绝授权的路径
可以模拟请求
这个是授权界面的地址,放在前端跳转的,直接复制
接下里就是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和密钥换下就行可以运行了