博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring Boot——基于OkHTTP的GitHub第三方登录DEMO
阅读量:2036 次
发布时间:2019-04-28

本文共 5470 字,大约阅读时间需要 18 分钟。

基本概念

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

OkHttp是默认情况下有效的HTTP客户端:

  • HTTP / 2支持允许对同一主机的所有请求共享一个套接字。
  • 连接池可减少请求延迟(如果HTTP / 2不可用)。
  • 透明的GZIP缩小了下载大小。
  • 响应缓存可以完全避免网络重复请求。

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

API

Maven

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/

你可能感兴趣的文章
Linux(Ubuntu)下MySQL的安装与配置
查看>>
windows环境下面配置pip环境变量
查看>>
python之pip常用命令
查看>>
完整过程解决 ERROR 1045 (28000): Access denied for user 'mysql'@'localhost' (using password: NO)
查看>>
Centos 与本地终端 上传、下载 文件
查看>>
linux下更改MySQL数据库存储路径
查看>>
WebService到底是什么?
查看>>
Git的安装和使用
查看>>
Git常用命令
查看>>
MySQL常见问题
查看>>
Spring Boot 入门之缓存和 NoSQL 篇(四)
查看>>
系统结构的发展以及为什么要使用分布式系统
查看>>
分布式系统发展史
查看>>
基于Docker的CaaS容器云平台架构设计
查看>>
几张图帮你理解 docker 基本原理及快速入门
查看>>
理解Docker架构
查看>>
基于Docker和Kubernetes的最佳架构实践
查看>>
Kubernetes实现SSO登录 (二)
查看>>
从 Spring Cloud 看一个微服务框架的「五脏六腑」
查看>>
使用Docker高效搭建开发环境
查看>>