使用SpringBoot+OkHttp+fastjson实现Github的OAuth第三方登录
作者:技不如人甘拜下风 发布时间:2023-03-18 01:27:34
标签:SpringBoot,OkHttp,fastjson
一、在GitHub上创建一个OAuth
二、OAuth的原理
Spring官方文档
三、OkHttp的使用
OkHttp官方网站
1.Post
代码示例
//官方文档: public static final MediaType JSON
// = MediaType.get("application/json; charset=utf-8");
MediaType mediaType = MediaType.get("application/json; charset=utf-8");//去掉前缀,并且修改MediaType对象名,因为一会使用fastjson变量会重名
OkHttpClient client = new OkHttpClient();//第二句照抄
RequestBody body = RequestBody.create(json,mediaType);//直接复制方法体中的内容
Request request = new Request.Builder()
.url("")//填写要发送请求的地址
.post(body)
.build();
try (Response response = client.newCall(request).execute()) {
return response.body().string();//返回的字符串(json)
}
2.Get
代码示例
OkHttpClient client = new OkHttpClient();//同上
Request request = new Request.Builder()//直接复制方法体中的内容
.url(url)//同上
.build();
try (Response response = client.newCall(request).execute()) {
return response.body().string();//同上
}
四、fastJson的使用
JSON.toJSONString(实体类)//将实体类转换为JSON字符串
JSON.parseObject(string, 实体类.class);//将JSON字符串转换为实体类
五、代码示例
前端代码
<a href="https://github.com/login/oauth/authorize?client_id=xxx&redirect_uri=http://127.0.0.1:8080/xxx&scope=user&state=1" rel="external nofollow" >Login</a>
//scope和state不写可能会报错
@Controller
public class AuthorizeController {
@Autowired
GithubProvider githubProvider;
@GetMapping("/callback")
public String callback(@RequestParam(name ="code") String code, @RequestParam(name ="state") String state){
AccessTokenDTO accessTokenDTO = new AccessTokenDTO();
accessTokenDTO.setClient_id("");
accessTokenDTO.setClient\_secret("");
accessTokenDTO.setCode(code);
accessTokenDTO.setState(state);
accessTokenDTO.setRedirect\_uri("https://github.com/login/oauth/access_token");
String token = githubProvider.getAccessToken(accessTokenDTO);
GithubUser githubUser = githubProvider.getUser(token);
return "index";
}
}
@Component
public class GithubProvider {
public String getAccessToken(AccessTokenDTO accessTokenDTO){
MediaType mediaType = MediaType.get("application/json; charset=utf-8");
OkHttpClient client = new OkHttpClient();
RequestBody body = RequestBody.create(JSON.toJSONString(accessTokenDTO),mediaType);//用fastjson将实体类转换为json字符串传入
Request request = new Request.Builder()
.url("https://github.com/login/oauth/access_token?cilen_id=xxx&client_secret=xxx"+accessTokenDTO.getCode()+
"&redirect_uri=http://127.0.0.1:8080/callback&state=1")
.post(body)
.build();
try (Response response = client.newCall(request).execute()) {
String string = response.body().string();
String token = string.split("&")\[0\].split("=")\[1\];
return token;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public GithubUser getUser(String token){
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://api.github.com/user?access_token="+token)
.build();
try (Response response = client.newCall(request).execute()) {
String string = response.body().string();
GithubUser githubUser = JSON.parseObject(string, GithubUser.class);//用fastjson将json字符串转换为实体类
return githubUser;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
来源:https://segmentfault.com/a/1190000021669924


猜你喜欢
- 首先给大家来讲一个我们遇到的一个奇怪的问题:1.我的一个springboot项目,用mvn install打包成jar,换一台有jdk的机器
- 首先设定TextView的clickable属性为true。可以在布局文件中进行设定,比如:<TextViewandroid:id=&
- 定义:动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活。设计初衷:
- 一、项目简述功能:登录,门诊划价,收费,报表,药品管理等等功能。二、项目运行运行环境: Jdk1.8 + Tomcats . 5 + mys
- 1.C#是一种从C++和Java继承而来的,简单的,现代的,面向对象的语言.2.它的目标是综合Visual Basic高产和C++底层高效的
- 修改FeginCilent定义的服务名到指定服务通过覆盖类来修改对应的服务名,这里将所有的FeginClient对应的服务名都修改好。pac
- 解释:二叉树的深度:从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。二叉树的宽度:二叉树的每一层中
- 一、概述xml整合第三方框架有两种整合方案:不需要自定义名空间,不需要使用Spring的配置文件配置第三方框架本身内容,例如:MyBatis
- 这篇文章主要介绍了spring boot多数据源动态切换代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- > 因为我的工作要用kotlin所以今天在这里给大家总结一下关于全局语言切换的kotlin语言实现实现,很简单,希望在这里可以帮助到有
- 场景:同一个用户在2秒内对同一URL的提交视为重复提交。思考逻辑:1.从数据库方面考虑,数据设计的时候,某些数据有没有唯一性,如果有唯一性,
- 对于某些程序,我们只允许它使用某些特定端口、网络类型或者特定IP类型等信息。这时候,需要使用到防火墙里面的“高级设置”,创建某些特定的入站或
- 先来说一说我们为什么要用这个东西啊!比如,我们现在有这样了个问题要解决:这样,我们就要用到中间消息间了然后我们就说一下什么是中间消息间吧。采
- 对于跨域,相信同学们都有所了解。前端的跨域的若干种方式,大家也都知道,什么 JSONP,iframe+domain 等等。但是我们今天的主题
- 桥接模式桥接模式是将抽象部分与它的实现部分分离,使他们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)
- 最近看到一个考试系统,有个功能是用来监视进程的。一旦发现如Communicator.exe这样的违禁软件就立即杀死进程并上报给服务器。我稍
- 前言在有些业务场景中,系统对于响应时间有一定的要求,而一个方法里面同步执行的业务逻辑太多势必会影响响应速度,带来不好的用户体验。比如登录时记
- 本文实例讲述了C#使用iTextSharp封装的PDF文件操作类。分享给大家供大家参考。具体分析如下:这个C#代码主要讲iTextSharp
- 中文乱码问题真的是一个很棘手的问题,特别是从前台传到后台之后,都不知道问题出在哪里了。现在分享解决javaWEB中前后台中文乱码问题的3种方
- 所谓回调,就是客户程序C调用服务程序S中的某个方法A,然后S又在某个时候反过来调用C中的某个方法B,对于C来说,这个B便叫做回调方法。下面看