1、使用的技术
前端:超链接a标签
后端 :spring 的 RestTemplate 发送请求给GitHub
2、前期准备
先去GitHub设置GitHub app ,
(1)登录GitHub
(2)头像—> settings----->Developer setting
(3)填写信息应用名字Application name,Homepage URL网站主页(可填本地调试路径),Authorization callback URL回调路径(可填本地调试路径)
(4)提交后获得Client ID和Client Secret千万不要给别人
3、实现步骤
(1)发请求到GitHub获取code,路径: https://github.com/login/oauth/authorize?client_id=XXXX&state=XXXX&redirect_uri=XXXX&code=XXXX
(2)在回调的路径写业务逻辑,post方式获取access_token。路径:https://github.com/login/oauth/access_token?client_id=XXXX&client_secret=XXXX
(3)把access_token发给GitHub获取用户信息。路径:https://api.github.com/user?access_token=XXXX
GitHub的开发官方文档
4、java,springboot实现
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
(1)发请求给GitHub获取code,其中redirect_uri为GitHub回调路径 Authorization callback URL。
路径: https://github.com/login/oauth/authorize?client_id=XXXX&state=XXXX&redirect_uri=XXXX
官方文档参数参考
(2)用户同意授权后,跳转到callback URL,在callback URL里实现接下来的步骤。
RestTemplate的postForObject方法提交post到GitHub获取access_token,根据access_token发送get请求获取用户信息
代码如下
@RequestMapping("/tologin.spring")
public String tologin(@RequestParam("code") String code){
System.out.println(code);
Map<String,String> map=new HashMap<>();
map.put("code",code);
map.put("redirect_uri","http://127.0.0.1/tologin.spring");
RestTemplate request=new RestTemplate();
accessTokenUrl+="&code="+code;
String s=request.postForObject(accessTokenUrl,String.class, String.class,map);
System.out.println("accessTokenUrl返回的数据:"+s);
//获取用户信息
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
String[] str=s.split("&");
String access_token=str[0].substring(str[0].indexOf("="));
System.out.println("access_token:"+access_token);
String reqJsonStr = "{\"access_token\":\""+access_token+"\"}";
HttpEntity<String> entity = new HttpEntity<String>(reqJsonStr,headers);
ResponseEntity<Map> resp = request.exchange(userInfoUrl+access_token, HttpMethod.GET, entity, Map.class);
System.out.println("用户信息:"+resp.toString());
return "index";
}
官方文档参数参考
对于post请求,这里我很困惑,我一开始是请求路径为
https://github.com/login/oauth/access_token
,然后参数写在map里,然后运行报404错误,参数要放到请求路径上,获取用户信息的get请求,参数也是要放到请求路径上,不然也报错,如果你有答案可以评论告诉我。
使用RestTemplate,你可能会遇到的问题:Connection reset
我一开始在处理第二个请求get时,再实例化了一个RestTemplate,然后用getForObject()发送请求,报Connection reset错误,
然后把第一个post和get请求的getForObject()和postForObject()都换成exchange(),也报Connection reset错误,最后换成了先用postForObject(),然后get请求用exchange(),解决问题