Spring Boot(八):Okhttp实现GitHub第三方登录

最近一直在学习springboot,刚刚看完雷丰阳老师讲的springboot基础、整合视频,相见恨晚的赶脚,顺理成章的看了尚硅谷的springboot谷粒商城项目视频,但是,有种说不出的感觉,看了16节,还是放弃了,在bilibili上又搜索了一番,找到了现在学习的这个视频,码匠社区项目,看了几节,感觉还可以,项目中用到了GitHub第三方登录,第一次接触,感觉挺好用的,自然要写篇博客记录一下啦。

一、基本概念

 OkHTTP:HTTP是现代应用程序网络的方式,也就是我们交换数据和媒体的方式,有效地执行HTTP可使您的内容加载更快更节省带宽。

1、OkHTTP是默认情况下有效的HTTP客户端:

(1)HTTP/2支持允许对同一主机的所有请求共享一个套接字。

(2)连接池可减少请求延迟

(3)透明的GZIP缩小了下载大小

(4)响应缓存可以完全避免网络重复请求

2、GitHub OAuth APP:OAuth是一种授权机制,数据的所有者告诉系统,同一授权第三方应用进入系统,获取这些数据。系统从而产生一个短期的进入令牌token,用来代替密码,供第三方使用。

二、API

https://developer.github.com/apps/building-oauth-apps/authorizing-oauth-apps/

三、OkHTTP实现GitHub第三方登录

四、Maven

1<dependencies> 2 <dependency> 3 <groupId>org.springframework.boot</groupId> 4 <artifactId>spring-boot-starter-thymeleaf</artifactId> 5 </dependency> 6 <dependency> 7 <groupId>org.springframework.boot</groupId> 8 <artifactId>spring-boot-starter-web</artifactId> 9 </dependency> 10 11 <dependency> 12 <groupId>org.springframework.boot</groupId> 13 <artifactId>spring-boot-devtools</artifactId> 14 <scope>runtime</scope> 15 <optional>true</optional> 16 </dependency> 17 18 <dependency> 19 <groupId>org.springframework.boot</groupId> 20 <artifactId>spring-boot-starter-test</artifactId> 21 <scope>test</scope> 22 <exclusions> 23 <exclusion> 24 <groupId>org.junit.vintage</groupId> 25 <artifactId>junit-vintage-engine</artifactId> 26 </exclusion> 27 </exclusions> 28 </dependency> 29 30 <!--HTTPClient--> 31 <dependency> 32 <groupId>com.squareup.okhttp3</groupId> 33 <artifactId>okhttp</artifactId> 34 <version>4.3.1</version> 35 </dependency> 36 <dependency> 37 <groupId>com.squareup.okhttp3</groupId> 38 <artifactId>mockwebserver</artifactId> 39 <version>4.3.1</version> 40 </dependency> 41 <!--JSON--> 42 <dependency> 43 <groupId>com.alibaba</groupId> 44 <artifactId>fastjson</artifactId> 45 <version>1.2.58</version> 46 </dependency> 47</dependencies>

五、代码实例

application.properties

1server.port=8080 2 3github.client.id=27dda83xxxxxx36043d4 4github.client.secret=01f948axxxxxxef10d9132cfe6083dxxxxxx5f3503 5github.redirect.uri=http://localhost:8080/callback

GitHubProvider.java

1package life.majiang.community.provider; 2 3import life.majiang.community.dto.AccessTokenDTO; 4import life.majiang.community.dto.GitHubUser; 5import com.alibaba.fastjson.JSON; 6import okhttp3.*; 7import org.springframework.stereotype.Component; 8 9import java.io.IOException; 10 11@Component 12public class GitHubProvider { 13 private static final MediaType MediaType_JSON 14 = MediaType.get("application/json; charset=utf-8"); 15 public String getAccessToken(AccessTokenDTO accessTokenDTO){ 16 17 OkHttpClient client = new OkHttpClient(); 18 RequestBody body = RequestBody.create(JSON.toJSONString(accessTokenDTO), MediaType_JSON); 19 Request request = new Request.Builder() 20 .url("https://github.com/login/oauth/access_token") 21 .post(body) 22 .build(); 23 try (Response response = client.newCall(request).execute()) { 24 String resstring = response.body().string(); 25 String token =resstring.split("&")[0] 26 .split("=")[1]; 27 return token; 28 }catch (IOException e) { 29 e.printStackTrace(); 30 } 31 return null; 32 } 33 public GitHubUser getUser(String AccessToken){ 34 OkHttpClient client = new OkHttpClient(); 35 Request request = new Request.Builder() 36 .url("https://api.github.com/user?access_token="+AccessToken) 37 .build(); 38 try{ 39 Response response = client.newCall(request).execute(); 40 String res = response.body().string(); 41 GitHubUser gitHubUser = JSON.parseObject(res, GitHubUser.class); 42 return gitHubUser; 43 } catch (IOException e) { 44 e.printStackTrace(); 45 } 46 return null; 47 } 48}

AuthorizeController.java

1package life.majiang.community.controller; 2 3 4import life.majiang.community.dto.AccessTokenDTO; 5import life.majiang.community.dto.GitHubUser; 6import life.majiang.community.provider.GitHubProvider; 7import org.springframework.beans.factory.annotation.Autowired; 8import org.springframework.beans.factory.annotation.Value; 9import org.springframework.stereotype.Controller; 10import org.springframework.web.bind.annotation.GetMapping; 11import org.springframework.web.bind.annotation.RequestParam; 12import org.springframework.web.bind.annotation.ResponseBody; 13 14import javax.servlet.http.HttpServletRequest; 15 16/** 17 * 18 */ 19@Controller 20public class AuthorizeController { 21 22 @Autowired 23 private GitHubProvider gitHubProvider; 24 @Value("${github.client.id}") 25 private String clientId; 26 @Value("${github.client.secret}") 27 private String clientSecret; 28 @Value("${github.redirect.uri}") 29 private String redirectURI; 30 31 @GetMapping("/callback") 32 public String callBack(@RequestParam(name = "code")String code, 33 @RequestParam(name = "state") String state, 34 HttpServletRequest request){ 35 AccessTokenDTO accessTokenDTO = new AccessTokenDTO(); 36 accessTokenDTO.setClient_id(clientId); 37 accessTokenDTO.setClient_secret(clientSecret); 38 accessTokenDTO.setCode(code); 39 accessTokenDTO.setRedirect_uri(redirectURI); 40 accessTokenDTO.setState(state); 41 String accessToken = gitHubProvider.getAccessToken(accessTokenDTO); 42 GitHubUser user = gitHubProvider.getUser(accessToken); 43 if(user != null){ 44 //登录成功 45 request.getSession().setAttribute("user",user); 46 return "redirect:index"; 47 }else { 48 //登录失败 49 return "redirect:index"; 50 } 51 //return "index"+user.toString(); 52 } 53 54}

HTTP Request

https://github.com/login/oauth/authorize?client_id=27dda83ebxxxxxxx43d4&redirect_uri=http://localhost:8080/callback&scope=user&state=1

六、运行结果

 

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

SpringBoot自定义序列化的使用方式

场景及需求:项目接入了SpringBoot开发,现在需求是服务端接口返回的字段如果为空,那么自动转为空字符串。例如:\    {        "id":1,        "name":null    },    {        "id":2,        "name":"x

Spring Boot(十四):Spring Boot + mybatis + Thymeleaf 分页示例(纯底层代码,不是pagehelper)

最近放假在家,终于有时间学习springboot了,当下最流行的java框架,我还没有接触过,有点遗憾,看过尚硅谷雷丰阳老师的springboot基础整合篇,现在轮到项目整合了,在B站发现一个码匠社区项目挺好的,最近刚完成了分页部分的练习,居然没用插件,直接原生代码,有点牛笔。!(https://oscimg.oschina.net/oscnet/u

Spring Boot(八):Okhttp实现GitHub第三方登录 - HelloWorld