SpringMVC应用使用github授权登陆

项目地址

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还有签名了。最后我们将页面重定向到我们的初始页面。你可以自己把得到的数据在页面上显示出来,这很容易。

原文地址:https://www.cnblogs.com/yfc0818/p/11072591.html