javascript
Spring Boot——基于OkHTTP的GitHub第三方登录DEMO
基本概念
OkHTTP:HTTP是現(xiàn)代應(yīng)用程序網(wǎng)絡(luò)的方式。這就是我們交換數(shù)據(jù)和媒體的方式。有效地執(zhí)行HTTP可使您的內(nèi)容加載更快并節(jié)省帶寬。
OkHttp是默認(rèn)情況下有效的HTTP客戶(hù)端:
- HTTP / 2支持允許對(duì)同一主機(jī)的所有請(qǐng)求共享一個(gè)套接字。
- 連接池可減少請(qǐng)求延遲(如果HTTP / 2不可用)。
- 透明的GZIP縮小了下載大小。
- 響應(yīng)緩存可以完全避免網(wǎng)絡(luò)重復(fù)請(qǐng)求。
GitHub OAuth APP:OAuth 是一種授權(quán)機(jī)制。數(shù)據(jù)的所有者告訴系統(tǒng),同意授權(quán)第三方應(yīng)用進(jìn)入系統(tǒng),獲取這些數(shù)據(jù)。系統(tǒng)從而產(chǎn)生一個(gè)短期的進(jìn)入令牌(token),用來(lái)代替密碼,供第三方應(yīng)用使用。
API
https://developer.github.com/apps/building-oauth-apps/authorizing-oauth-apps/
Maven
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency><!--HTTPClient--><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.3.1</version></dependency><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>mockwebserver</artifactId><version>4.3.1</version></dependency><!--JSON--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.58</version></dependency></dependencies>?
源代碼
application.properties
server.port=8080github.client.id=27dda83xxxxxx36043d4 github.client.secret=01f948axxxxxxef10d9132cfe6083dxxxxxx5f3503 github.redirect.uri=http://localhost:8080/callbackGitHubProvider.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;@Component public 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;/****/ @Controller public class AuthorizeController {@Autowiredprivate 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運(yùn)行結(jié)果
教學(xué)資源
https://www.bilibili.com/video/av65117012?p=8
參考文章
http://www.ruanyifeng.com/blog/2019/04/oauth_design.html
http://www.ruanyifeng.com/blog/2019/04/github-oauth.html
總結(jié)
以上是生活随笔為你收集整理的Spring Boot——基于OkHTTP的GitHub第三方登录DEMO的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Vue——组件化开发DEMO
- 下一篇: Spring Boot——MyBatis