本文共 5470 字,大约阅读时间需要 18 分钟。
OkHTTP:HTTP是现代应用程序网络的方式。这就是我们交换数据和媒体的方式。有效地执行HTTP可使您的内容加载更快并节省带宽。
OkHttp是默认情况下有效的HTTP客户端:
- HTTP / 2支持允许对同一主机的所有请求共享一个套接字。
- 连接池可减少请求延迟(如果HTTP / 2不可用)。
- 透明的GZIP缩小了下载大小。
- 响应缓存可以完全避免网络重复请求。
GitHub OAuth APP:OAuth 是一种授权机制。数据的所有者告诉系统,同意授权第三方应用进入系统,获取这些数据。系统从而产生一个短期的进入令牌(token),用来代替密码,供第三方应用使用。
org.springframework.boot spring-boot-starter-thymeleaf org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-devtools runtime true org.springframework.boot spring-boot-starter-test test org.junit.vintage junit-vintage-engine com.squareup.okhttp3 okhttp 4.3.1 com.squareup.okhttp3 mockwebserver 4.3.1 com.alibaba fastjson 1.2.58
application.properties
server.port=8080github.client.id=27dda83xxxxxx36043d4github.client.secret=01f948axxxxxxef10d9132cfe6083dxxxxxx5f3503github.redirect.uri=http://localhost:8080/callback
GitHubProvider.java
package club.zstuca.platform.provider;import club.zstuca.platform.dto.AccessTokenDTO;import club.zstuca.platform.dto.GitHubUser;import com.alibaba.fastjson.JSON;import okhttp3.*;import org.springframework.stereotype.Component;import java.io.IOException;@Componentpublic class GitHubProvider { private static final MediaType MediaType_JSON = MediaType.get("application/json; charset=utf-8"); public String getAccessToken(AccessTokenDTO accessTokenDTO){ OkHttpClient client = new OkHttpClient(); RequestBody body = RequestBody.create(JSON.toJSONString(accessTokenDTO), MediaType_JSON); Request request = new Request.Builder() .url("https://github.com/login/oauth/access_token") .post(body) .build(); try (Response response = client.newCall(request).execute()) { String resstring = response.body().string(); String token =resstring.split("&")[0] .split("=")[1]; return token; }catch (IOException e) { e.printStackTrace(); } return null; } public GitHubUser getUser(String AccessToken){ OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url("https://api.github.com/user?access_token="+AccessToken) .build(); try{ Response response = client.newCall(request).execute(); String res = response.body().string(); GitHubUser gitHubUser = JSON.parseObject(res, GitHubUser.class); return gitHubUser; } catch (IOException e) { e.printStackTrace(); } return null; }}
AuthorizeController.java
package club.zstuca.platform.controller;import club.zstuca.platform.dto.AccessTokenDTO;import club.zstuca.platform.dto.GitHubUser;import club.zstuca.platform.provider.GitHubProvider;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.ResponseBody;import javax.servlet.http.HttpServletRequest;/** * */@Controllerpublic class AuthorizeController { @Autowired private GitHubProvider gitHubProvider; @Value("${github.client.id}") private String clientId; @Value("${github.client.secret}") private String clientSecret; @Value("${github.redirect.uri}") private String redirectURI; @GetMapping("/callback") public String callBack(@RequestParam(name = "code")String code, @RequestParam(name = "state") String state, HttpServletRequest request){ AccessTokenDTO accessTokenDTO = new AccessTokenDTO(); accessTokenDTO.setClient_id(clientId); accessTokenDTO.setClient_secret(clientSecret); accessTokenDTO.setCode(code); accessTokenDTO.setRedirect_uri(redirectURI); accessTokenDTO.setState(state); String accessToken = gitHubProvider.getAccessToken(accessTokenDTO); GitHubUser user = gitHubProvider.getUser(accessToken); if(user != null){ //登录成功 request.getSession().setAttribute("user",user); return "redirect:index"; }else { //登录失败 return "redirect:index"; } //return "index"+user.toString(); }}
HTTP Request
https://github.com/login/oauth/authorize?client_id=27dda83ebxxxxxxx43d4&redirect_uri=http://localhost:8080/callback&scope=user&state=1
转载地址:http://regaf.baihongyu.com/