【第三方互联】13、码云(Gitee)授权第三方登录

【第三方互联】13、码云(Gitee)授权第三方登录今天我们来学习:码云(Gitee)授权第三方登录,相比之前支付宝登录、腾讯QQ登录以及新浪微博登录来说,相对于比较简单一、准备工作1、登录码云官网官网地址:https://gitee.com/注册、登录我们的账号2、创建应用在右上角菜单找到“设置”选项在“安全设置”下找到“第三方应用”点击“创建应用”开始创建第三方应用按照要求填写…

今天我们来学习:码云(Gitee)授权第三方登录,相比之前 支付宝登录腾讯QQ登录 以及 新浪微博登录 来说,相对于比较简单

一、准备工作

官网地址:https://gitee.com/

注册、登录我们的账号

  • 2、创建应用
    设置
    在右上角菜单找到 “设置” 选项
    第三方应用
    在 “安全设置” 下找到 “第三方应用”
    我的应用
    点击 “创建应用” 开始创建第三方应用
    创建应用信息
    按照要求填写应用信息即可
    应用详情
  • 3、将应用信息保存到项目中
    应用配置信息
    由于我使用的是 SpringBoot 项目,我放在了 application.yml 文件中

二、开始开发

  • 1、引入 Maven 依赖
<!-- 网络请求 -->
<dependency>
	<groupId>org.apache.httpcomponents</groupId>
	<artifactId>httpclient</artifactId>
	<version>4.5.6</version>
</dependency>
<!-- alibaba的fastjson -->
<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>fastjson</artifactId>
	<version>1.2.51</version>
</dependency>

其余的依赖请自行加入

  • 2、在页面放置 “码云(Gitee)” 授权登录的 DOM 元素
<a th:href="@{gitee/auth}" class="link" title="Gitee登录"><i class="iconfont icon-gitee"></i></a>

这里使用的是阿里的 iconfont 图标

三、接口类

创建 “码云(Gitee)” 授权登录的 Controller,GiteeController.java

  • 1、从配置文件中获取 “码云(Gitee)” 配置信息
/** * gitee授权中提供的 appid 和 appkey */
@Value("${gitee.oauth.clientid}")
public String CLIENTID;
@Value("${gitee.oauth.clientsecret}")
public String CLIENTSECRET;
@Value("${gitee.oauth.callback}")
public String URL;
  • 2、页面登录按钮点击后的接口
/** * 请求授权页面 */
@GetMapping(value = "/auth")
public String qqAuth(HttpSession session) { 
   
    // 用于第三方应用防止CSRF攻击
    String uuid = UUID.randomUUID().toString().replaceAll("-", "");
    session.setAttribute("state", uuid);

    // Step1:获取Authorization Code
    String url = "https://gitee.com/oauth/authorize?response_type=code" +
            "&client_id=" + CLIENTID +
            "&redirect_uri=" + URLEncoder.encode(URL) +
            "&state=" + uuid +
            "&scope=user_info";

    return PasswordUtils.redirectTo(url);
}

接口文档中建议我们在授权登录时传入一个加密的数据防止被攻击,我们传入了UUID,最后重定向到授权页面
授权页面

  • 3、当该用户点击“授权”按钮,同意授权后,就会回调到我们在应用中填写的回调地址里去
/** * 授权回调 */
@GetMapping(value = "/callback")
public String qqCallback(HttpServletRequest request) throws Exception { 
   
    HttpSession session = request.getSession();
    // 得到Authorization Code
    String code = request.getParameter("code");
    // 我们放在地址中的状态码
    String state = request.getParameter("state");
    String uuid = (String) session.getAttribute("state");

    // 验证信息我们发送的状态码
    if (null != uuid) { 
   
        // 状态码不正确,直接返回登录页面
        if (!uuid.equals(state)) { 
   
            return PasswordUtils.redirectTo("/login");
        }
    }

    // Step2:通过Authorization Code获取Access Token
    String url = "https://gitee.com/oauth/token?grant_type=authorization_code" +
            "&client_id=" + CLIENTID +
            "&client_secret=" + CLIENTSECRET +
            "&code=" + code +
            "&redirect_uri=" + URL;
    JSONObject accessTokenJson = GiteeHttpClient.getAccessToken(url);

    // Step3: 获取用户信息
    url = "https://gitee.com/api/v5/user?access_token=" + accessTokenJson.get("access_token");
    JSONObject jsonObject = GiteeHttpClient.getUserInfo(url);
    /** * 获取到用户信息之后,就该写你自己的业务逻辑了 */
    return PasswordUtils.redirectTo("/success");
}

四、网络请求方法

上面回调方法中所用到的网络接口方法,我放在了 GiteeHttpClient.java 文件中,主要有两个方法

  • 1、网络接口
/** * 获取Access Token * post */
public static JSONObject getAccessToken(String url) throws IOException { 
   
    HttpClient client = HttpClients.createDefault();
    HttpPost httpPost = new HttpPost(url);
    httpPost.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36");
    HttpResponse response = client.execute(httpPost);
    HttpEntity entity = response.getEntity();
    if (null != entity) { 
   
        String result = EntityUtils.toString(entity, "UTF-8");
        return JSONObject.parseObject(result);
    }
    httpPost.releaseConnection();
    return null;
}

/** * 获取用户信息 * get */
public static JSONObject getUserInfo(String url) throws IOException { 
   
    JSONObject jsonObject = null;
    CloseableHttpClient client = HttpClients.createDefault();

    HttpGet httpGet = new HttpGet(url);
    httpGet.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36");
    HttpResponse response = client.execute(httpGet);
    HttpEntity entity = response.getEntity();

    if (entity != null) { 
   
        String result = EntityUtils.toString(entity, "UTF-8");
        jsonObject = JSONObject.parseObject(result);
    }

    httpGet.releaseConnection();

    return jsonObject;
}

分别就是使用 code 获取 token,在使用 token 获取 用户信息

注意:我们需要在请求时加上请求头

User-Agent Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36

最终我们获取到一个 JSON 对象,该对象包含了用户的信息,例如:id,name,email,phone 等等。

https://gitee.com/api/v5/oauth_doc#/

五、总结

该授权认证过程符合 OAuth2 认证基本流程,流程如下:
授权过程

1、用户点击页面登录按钮,请求授权页面,用户在此页面登录账号并同意授权
2、用户同意授权后,回调至我们项目中,首先验证 state 是否一致
3、使用上一步拿到的 code 请求 access_token
4、使用 access_token 请求 用户信息,完成授权登录过程

下一篇:

【第三方互联】十四、Github授权第三方登录

如您在阅读中发现不足,欢迎留言!!!

今天的文章【第三方互联】13、码云(Gitee)授权第三方登录分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/25377.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注