SpringMVC应用使用github授权登陆

本文介绍了使用SpringMVC实现GitHub OAuth登陆的方法。先查看GitHub OAuth登陆API,明确将界面重定向到GitHub登陆页面、获取access_token令牌、携带令牌获取用户信息这三个步骤。接着编写SpringMVC代码,包括重定向到GitHub、用POST换取令牌、携带令牌获取用户信息,使用了okhttp和fastjson库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目地址

1.查看github OAuth登陆api

API地址
这里直接来理一下,使用github OAuth登陆的三个步骤
在这里插入图片描述
这里是官网的步骤

  1. 将界面重定向到github登陆页面。
  2. github确认登陆后,再将页面重定向到自己设置的重定向页面,同时携带一个code,再去请求github的界面从而获取access_token令牌。
  3. 携带这个access_token令牌再去post github的接口去获取用户信息。

2.编写SpringMVC中的代码

1.重定向到github

首先我们有了个前端界面,界面是这样的
在这里插入图片描述
我们希望点击登陆按钮后,可以在登陆按钮的位置显示自己的登陆后的用户名那首先需要在HTML中在登陆按钮那里链接到Github官方提供的第一次跳转,携带下面的参数,
我是这样写的

<li th:if="${session.user==null}"><a href="https://github.com/login/oauth/authorize?client_id=30696dea27f0f7ec9475&redirect_uri=http://localhost:8888/callback&scope=user&state=1">登陆</a></li>

在这里插入图片描述
跳转到github的登陆页面,登陆之后会重定向到自己的界面,然后接收code参数,接下来我们会使用这个code去向github换取access_token令牌

2.使用POST换取令牌

在这里插入图片描述
这里我们需要在代码中向https://github.com/login/oauth/access_token 发送HTTP请求,我是用的是okhttp这个第三方库。访问其官网,查看文档就可以知道如何发送POST请求。那么发送POST请求前,我们需要先提供参数,可以看到需要在代码里写的参数超过了5个,那么我们选择构造一个参数类,里面提供我们需要的参数,把然后这个类作为参数。但是类作为参数输入还有一个问题,就是怎么读取里面的参数,我是使用阿里的一个库,叫做fastjson,代码大致如下

public String getAccessToken(AccessTokenDto accesstoken) {
        MediaType mediaType = MediaType.get("application/json; charset=utf-8");
        OkHttpClient client = new OkHttpClient();

        RequestBody body = RequestBody.create(mediaType, JSON.toJSONString(accesstoken));
        Request request = new Request.Builder()
                .url("https://github.com/login/oauth/access_token")
                .post(body)
                .build();

        try (Response response = client.newCall(request).execute()) {
            String string = response.body().string();
            String result = string.split("&")[0].split("=")[1];;
            System.out.println(result);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

其中AccessTokenDto是个参数类,里面包含了五个属性,一一对应需要提供的我们的参数。最后我们通过对返回的解析,得到access_token。

3.携带令牌去获取用户信息

首先要知道,我们需要返回的什么参数,你可以先手动使用access_token去获取一次,我这里是选取了几个参数,
在这里插入图片描述
同样是构造类,然后使用fastjson从返回值中自动筛选出我们需求的参数。这里用的就是http里的get方法,同样我们使用okhttp库中的get方法,代码大致如下

 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 string = response.body().string();
            GithubUser githubUser = JSON.parseObject(string, GithubUser.class);
            return githubUser;
        } catch (IOException e) {
        }
        return null;
    }

这样我们就得到了用户的github用户名了,ID还有签名了。最后我们将页面重定向到我们的初始页面。你可以自己把得到的数据在页面上显示出来,这很容易。

大部分Java应用都是Web应用,展现层是Web应用不可忽略的重要环节。Spring为展现层提供了一个优秀的Web框架——Spring MVC。和众多其它Web框架一样,它基于MVC设计理念,此外,由于它采用了松散耦合可插拔组件结构,具有比其它MVC框架更多的扩展性和灵活性。 Spring MVC框架围绕DispatcherServlet这个核心展开,DispatcherServlet的作用是截获请求并组织一系列组件共同完成请求的处理工作。 JavaServer Faces (JSF) 是一种用于构建 Web 应用程序的新标准 Java 框架。它提供了一种以组件为中心来开发 Java Web 用户界面的方法,从而简化了开发。JavaServer Faces 还引起了广大 Java/Web 开发人员的兴趣。“企业开发人员”和 Web 设计人员将发现 JSF 开发可以简单到只需将用户界面 (UI) 组件拖放到页面上,而“系统开发人员”将发现丰富而强健的 JSF API 为他们提供了无与伦比的功能和编程灵活性。JSF 还通过将良好构建的模型-视图-控制器 (MVC) 设计模式集成到它的体系结构中,确保了应用程序具有更高的可维护性。最后,由于 JSF 是通过 Java Community Process (JCP) 开发的一种 Java 标准,因此开发工具供应商完全能够为 JavaServer Faces 提供易于使用的、高效的可视化开发环境。 ① 整个过程开始于客户端发送一个HTTP请求; ② DispatcherServlet接收这个请求后,并将请求的处理工作委托给具体的处理器(Handler),后者负责处理请求执行相应的业务逻辑。在这之前,DispatcherServlet必须能够凭借请求信息(URL或请求参数等)按照某种机制找到请求对应的处理器,DispatcherServlet是通过垂询HandlerMapping完成这一工作的; ③ 当DispatcherServlet从HandlerMapping中得到当前请求对应的处理器后,它就将请求分派给这个处理器。处理器根据请求的信息执行相应的业务逻辑,一个设计良好的处理器应该通过调用Service层的业务对象完成业务处理,而非自己越俎代庖。 Spring提供了丰富的处理器类型,在真正处理业务逻辑前,有些处理器会事先执行两项预处理工作: 1)将HttpServletRequest请求参数绑定到一个POJO对象中; 2)对绑定了请求参数的POJO对象进行数据合法性校验; ④ 处理器完成业务逻辑的处理后将返回一个ModelAndView给DispatcherServlet,ModelAndView包含了视图逻辑名和渲染视图时需要用到的模型数据对象; ⑤ 由于ModelAndView中包含的是视图逻辑名,DispatcherServlet必须知道这个逻辑名对应的真实视图对象,这项视图解析的工作通过调用ViewResolver来完成; ⑥ 当得到真实的视图对象后,DispatcherServlet将请求分派给这个View对象,由其完成Model数据的渲染工作; ⑦ 最终客户端得到返回的响应,这可能是一个普通的HTML页面,也可能是一个Excel电子表格、甚至是一个PDF文档等不一而足的视图形式,Spring的视图类型是异常丰富和灵活的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值