第三方授权登录:GitHub授权登录Java实现,以及RestTemplate的Connection reset错误

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(),解决问题

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OkHttp是一个流行的开源的HTTP客户端,它可以用于发送和接收HTTP请求。要实现GitHub第三方登录,我们可以使用OkHttp向GitHub的认证服务器发送请求,并获取授权码或访问令牌。 下面是一个用OkHttp实现GitHub第三方登录的简单的步骤: 1. 首先,我们需要在GitHub开发者平台注册一个应用程序,获得Client ID和Client Secret。这些凭证将用于向GitHub认证服务器证明我们的应用程序的身份。 2. 在应用程序中,创建一个OkHttpClient实例并实例化一个Request对象。Request对象应该包含登录请求的URL、请求方法(一般是GET或POST)、请求头(包括Accept和User-Agent等)以及需要的参数(如Client ID、Client Secret和一些其他参数)。 3. 调用OkHttpClient的newCall方法并传入Request对象来创建Call对象。 4. 调用Call对象的execute方法来发送请求并获取响应。得到的响应是一个Response对象。 5. 从Response对象中获取响应的内容,可能是JSON格式的数据。如果响应中包含授权码或访问令牌,我们可以将其用于后续的访问。 6. 进行登录验证和其他操作。根据响应内容和需要,可以使用OkHttp继续发送请求并处理响应。 需要注意的是,此处的步骤是简化的,并且可能因GitHub的认证流程而有所不同。在实际的应用程序中,还需要处理认证过程中的错误、重试机制、OAuth协议的授权流程等相关问题。 总结来说,使用OkHttp实现GitHub第三方登录需要创建OkHttpClient和Request对象,发送请求并获取响应,然后根据需要处理响应,获取授权码或访问令牌。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值