Spring Boot实现OAuth2.0登录实战

一、前言

最近在研究Springboot + Vue 的前后端分离框架,刚开始做登录功能,做着做着觉得普通账户密码登录太简单了,决定再加上 GitHub授权 和 人脸识别等多种快捷登录方式。


而GitHub授权登录正好用到了OAuth2.0中最复杂的授权码模式,正好拿我这个案例给大家分享一下OAuth2.0的授权过程。

二、授权流程

在具体做GitHub授权登录之前,咱们再简单回顾一下OAuth2.0授权码模式的授权流程,如果 fire 网站允许 用GitHub 账号登录,流程大致如下图。


以下是用户使用Github账号实现fire网站登录流程的说明:

  • fire 网站先让用户跳转到 GitHub 进行授权,会弹出一个授权框。

  • 用户同意后,GitHub 会根据redirect_uri 重定向回 fire 网站,同时返回一个授权码code。

  • fire 网站使用授权码和客户端密匙client_secret,向 GitHub 请求令牌token,检验通过返回令牌。

  • 最后fire 网站向GitHub 请求数据,每次调用 GitHub 的 API 都要带上令牌。

三、身份注册

要想得到一个网站的OAuth授权,必须要到它的网站进行身份注册,拿到应用的身份识别码 ClientID 和 ClientSecret。首先,打开Github的传送门 Sign in to GitHub · GitHub,有几个必填项。

  • Application name:我们的应用名;

  • Homepage URL:应用主页链接;

  • Authorization callback URL:这个是github 回调我们项目的地址,用来获取授权码和令牌。


提交后会看到就可以看到客户端ClientID 和客户端密匙ClientSecret,到这我们的准备工作就完成了。

四、授权开发

获取授权码

为了更好的看效果,获取授权码我处理的比较粗暴,直接在JS里拼装好了授权链接,但实际工作开发中一定要考虑到安全问题。

https://github.com/login/oauth/authorize?
client_id=ad41c05c211421c659db&
redirect_uri=http://47.93.6.5:8080/authorize/redirect

前端 Vue 的逻辑实现也非常简单,只需要 window.location.href 重定向一下即可。

<script>
export default {methods: {loginByGithub: function () {window.location.href = 'https://github.com/login/oauth/authorize?client_id=ad41c05c211421c659db&redirect_uri=http://47.93.6.5:8080/authorize/redirect'}}
}
</script>

请求后会提示让我们授权,同意授权后会重定向到authorize/redirect,并携带授权码code;如果之前已经同意过,会跳过这一步直接回调。

获取令牌

授权后紧接着就要回调 fire 网站接口,拿到授权码以后拼装获取令牌 access_token的请求链接,这时会用到客户端密匙client_secret。

https://github.com/login/oauth/access_token? client_id=${clientID}& client_secret=${clientSecret}& code=${requestToken}

access_token 会作为请求响应返回,结果是个串字符,需要我们截取一下。

access_token=4dc43c2f43b773c327f97acf5dd66b147db9259c&scope=&token_type=bearer

有了令牌以后开始获取用户信息,在 API 中要带上access_token。

https://api.github.com/user?access_token=4dc43c2f43b773c327f97acf5dd66b147db9259c

返回的用户信息是 JSON 数据格式,如果想把数据传递给前端,可以通过 url 重定向到前端页面,将数据以参数的方式传递。

{"login": "chengxy-nds","id": 12745094,"node_id": "","avatar_url": "https://avatars3.githubusercontent.com/u/12745094?v=4","gravatar_id": "","url": "https://api.github.com/users/chengxy-nds","html_url": "https://github.com/chengxy-nds","followers_url": "https://api.github.com/users/chengxy-nds/followers","following_url": "https://api.github.com/users/chengxy-nds/following{/other_user}","gists_url": "https://api.github.com/users/chengxy-nds/gists{/gist_id}","starred_url": "https://api.github.com/users/chengxy-nds/starred{/owner}{/repo}","subscriptions_url": "https://api.github.com/users/chengxy-nds/subscriptions","organizations_url": "https://api.github.com/users/chengxy-nds/orgs","repos_url": "https://api.github.com/users/chengxy-nds/repos","events_url": "https://api.github.com/users/chengxy-nds/events{/privacy}","received_events_url": "https://api.github.com/users/chengxy-nds/received_events","type": "","site_admin": false,"name": "程序员内点事","company": null,"blog": "","location": null,"email": "","hireable": null,"bio": null,"twitter_username": null,"public_repos": 7,"public_gists": 0,"followers": 14,"following": 0,"created_at": "2015-06-04T09:22:44Z","updated_at": "2020-07-13T06:08:57Z"
}

下边是 GitHub 回调我们 fire网站后端处理流程的部分代码,示例如下。

   @RequestMapping("/authorize/redirect")public ModelAndView authorize(@NotEmpty String code) {log.info("授权码code: {}", code);/*** 重新到前端主页*/String redirectHome = "http://47.93.6.5/home";try {/*** 1、拼装获取accessToken url*/String accessTokenUrl = gitHubProperties.getAccesstokenUrl().replace("clientId", gitHubProperties.getClientId()).replace("clientSecret", gitHubProperties.getClientSecret()).replace("authorize_code", code);/*** 返回结果中直接返回token*/String result = OkHttpClientUtil.sendByGetUrl(accessTokenUrl);log.info(" 请求 token 结果:{}", result);String accessToken = null;Pattern p = Pattern.compile("=(\\w+)&");Matcher m = p.matcher(result);while (m.find()) {accessToken = m.group(1);log.info("令牌token:{}", m.group(1));break;}/*** 成功获取token后,开始请求用户信息*/String userInfoUrl = gitHubProperties.getUserUrl().replace("accessToken", accessToken);String userResult = OkHttpClientUtil.sendByGetUrl(userInfoUrl);log.info("用户信息:{}", userResult);UserInfo userInfo = JSON.parseObject(userResult, UserInfo.class);redirectHome += "?name=" + userInfo.getName();} catch (Exception e) {log.error("授权回调异常={}", e);}return new ModelAndView(new RedirectView(redirectHome));}

最后,我们动图看一下整体的授权流程,由于GitHub的访问速度比较慢,偶尔会有请求超时的现象。


项目链接:https://github.com/chengxy-nds/fire.git

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/64682.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电脑开机提示error loading operating system怎么修复?

前一天电脑还能正常运行&#xff0c;但今天启动时却显示“Error loading operating system”&#xff08;加载操作系统错误&#xff09;。我已经仔细检查了硬盘、接线、内存、CPU和电源&#xff0c;确认这些硬件都没有问题。硬盘在其他电脑上可以正常使用&#xff0c;说明不是硬…

Java web的发展历史

目录 前言&#xff1a; 一.Model I和Model II 1.Model I开发模式 ​编辑 2.Model II开发模式 二. MVC模式 前言&#xff1a; 该篇文章主要介绍了Java web的发展历史&#xff0c;以及MVC相关内容 一.Model I和Model II 1.Model I开发模式 Model1的开发模式是&#xff…

Flink DataStream API 编程指南

(对于Flink的开发,建议使用Java,Scala的支持未来会被移除) DataStream是什么 DataStream API得名于DataStream这个Java类,可以将它们视为可以包含重复项的不可变数据集合。该数据可以是有限的,也可以是无限的,用于处理它们的API是相同的。 DataStream在用法上和普通的…

Intel-ECI之Codesys PLC + Ethercat 远端IO + Codesys IDE编程

目录 一、 准备工作 二、安装Codesys 软件 PLC 三、 使用Codesys IDE 编程测试 CODESYS* 是领先的独立于制造商的 IEC 61131-3 自动化软件&#xff0c;适用于工程控制系统。它用于 Intel Edge Controls for Industrial&#xff08;Intel ECI 或 ECI&#xff09;&#xff0c;…

SQL语句练习

阅读《SQL必知必会》&#xff08;第五版&#xff09;然后结合往常表做的练习记录 这里使用的数据库时sqlite3,使用的工具时navicat 表资源链接https://wenku.baidu.com/view/349fb3639b6648d7c1c74652.html 表录入后如上图所示。后面如果有多张表之间的操作&#xff0c;在引入…

Java游戏开发基础:从零开始制作一个简单的2D游戏

目录 游戏开发概述 开发工具 项目结构 1. 创建游戏窗口 2. 游戏面板 解释&#xff1a; 3. 玩家类 解释&#xff1a; 4. 障碍物类 解释&#xff1a; 5. 游戏循环与碰撞检测 总结 在现代游戏开发中&#xff0c;Java被广泛应用于创建各种类型的游戏&#xff0c;特别是…

【Python】【数据分析】深入探索 Python 数据可视化:Seaborn 可视化库详解

目录 引言一、Seaborn 简介二、安装 Seaborn三、Seaborn 的基本图形3.1 散点图&#xff08;Scatter Plot&#xff09;3.2 线图&#xff08;Line Plot&#xff09;3.3 条形图&#xff08;Bar Plot&#xff09;3.4 箱型图&#xff08;Box Plot&#xff09;3.5 小提琴图&#xff0…

input输入框的placeholder颜色修改(Shadow DOM)

placeholder颜色修改 使用参考说明 https://zh.javascript.info/shadow-dom 查看shadow tree的方法

MacPorts 中安装高/低版本软件方式,以 RabbitMQ 为例

查询信息 这里以 RabbitMQ 为例&#xff0c;通过搜索得到默认安装版本信息&#xff1a; port search rabbitmq-server结果 ~/Downloads> port search rabbitmq-server rabbitmq-server 3.11.15 (net)The RabbitMQ AMQP Server ~/Downloads>获取二进制文件 但当前官网…

Android不可擦除分区写文件恢复出厂设置,无法读写问题

普通应用往不可擦除分区写文件之后&#xff0c;恢复出厂设置 现象&#xff1a;概率性读不到写过之后的文件 12-18 10:57:31.348 7980 7980 W System.err: java.io.FileNotFoundException: /xxx/xxx: open failed: EACCES (Permission denied) 12-18 10:57:31.348 7980 79…

uniApp使用腾讯地图提示未添加maps模块

uniApp使用腾讯地图&#xff0c;打包提示未添加maps模块解决方案 这是报错信息&#xff0c;在标准基座运行的时候是没问题的&#xff0c;但是打包后会提示未添加&#xff0c;可以通过在mainfest里面把地图插件上腾讯地图的key更换高德地图的key&#xff0c;定位服务可以继续用腾…

【人工智能】用Python实现图卷积网络(GCN):从理论到节点分类实战

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 目录 引言图卷积网络理论基础 2.1 图的基本概念2.2 卷积神经网络在图上的扩展2.3 GCN的数学模型GCN的实现 3.1 环境配置3.2 数据集介绍与预处理3.3 模型构建3.4 训练与优化实战:节点分类 4.1 模型训练4.2 结果分…

图的遍历.

广度优先搜索算法是解决图问题的另一种算法,广度优先搜索算法的思路是,只要访问了一个节点,就将其相邻节点入队,以备在循环迭代中访问. 使用广度优先算法实现的具体过程如下: 1.选择一个初始节点入队,并在visited数组中将此节点所在位置标记为1,本实例选择节点为1 2.进入循环…

linux------vim命令

一、基本模式切换 普通模式&#xff08;Normal Mode&#xff09; 当你打开Vim时&#xff0c;默认进入普通模式。在这个模式下&#xff0c;可以使用各种命令来移动光标、删除文本、复制粘贴等操作。例如&#xff0c;使用h、j、k、l来移动光标。h是向左移动一个字符&#xff0c;j…

fastAPI接口的请求与响应——基础

1. 后端接口 1.接口实现 pip install fastapi pip install uvicorn# api.py from pydantic import BaseModel from fastapi import FastAPI import uvicorn import os# 定义请求体模型 class Payload(BaseModel):key1: strkey2: str# 创建一个FastAPI应用程序实例 app Fast…

Android学习(七)-Kotlin编程语言-Lambda 编程

Lambda 编程 而 Kotlin 从第一个版本开始就支持了 Lambda 编程&#xff0c;并且 Kotlin 中的 Lambda 功能极为强大。Lambda 表达式使得代码更加简洁和易读。 2.6.1 集合的创建与遍历 集合的函数式 API 是入门 Lambda 编程的绝佳示例&#xff0c;但在开始之前&#xff0c;我们…

数据可视化-2. 条形图

目录 1. 条形图适用场景分析 1.1 比较不同类别的数据 1.2 展示数据分布 1.3 强调特定数据点 1.4 展示时间序列数据的对比 1.5 数据可视化教育 1.6 特定领域的应用 2. 条形图局限性 3. 条形图图代码实现 3.1 Python 源代码 3.2 条形图效果&#xff08;网页显示&#…

2023年下半年软考信息安全工程师案例分析及答案解析

试题一(16分) 回答问题1至问题6,将解答填入答题纸对应的解答栏内。 问题1(4分) 已知DES算法S盒如下,请补全S盒空缺的数据(1)、(2)、(3)、(4)。 【参考答案】3、13、15、0 问题2(2分) 已知S盒的输入为110011,请计算经过S盒变换之后的二进制输出。 【参考…

Docker部署ant-design-pro V6.0.0

本文将指导您如何使用Docker部署ant-design-pro 6.0.0。ant-design-pro是一个基于Ant Design的企业级中后台前端/设计解决方案&#xff0c;使用Docker可以简化其部署过程&#xff0c;确保环境的一致性和可移植性。 环境准备 在开始之前&#xff0c;请确保您已经安装了以下软件…

工业摄像机基于电荷耦合器件的相机

工业摄像机系列产品及其识别技术的详细介绍&#xff1a; 一、工业摄像机概述 工业摄像机是利用光学成像技术获取视觉信息&#xff0c;并通过图像处理算法分析这些信息的设备。它通常具有高图像稳定性、高传输能力和高抗干扰能力等特性&#xff0c;适用于各种复杂的工业环境。 …