最近一直在学习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
六、运行结果
