Spring Security OAuth2简介

news2024/11/16 3:35:00

本文内容来自王松老师的《深入浅出Spring Security》,自己在学习的时候为了加深理解顺手抄录的,有时候还会写一些自己的想法。

OAuth2简介

      OAuth是一个开放标准,该标准允许用户让第三方应用访问该用户在某一个网站上存储的私密资源(如头像、照片、视频等),并且在这个过程中无须将用户的账号/密码提供给第三方应用。通过令牌(token)可以实现这一功能,每一个令牌授权一个特定的网站在特定的时间段内允许访问特定的资源。

        OAuth让用户可以授权第三方网站灵活访问他们存储在另外一些资源服务器上的特定信息,而非所有内容。对于用户而言,我们在互联网应用中最常见的OAuth应用就是各种第三方登录,例如QQ授权登录、微信授权登录、微博授权登录等等。

        例如,用户想要通过QQ登录今日头条,这时今日头条就是一个第三方应用,今日头条需要访问用户存储在QQ服务器上的一些基本信息,就需要得到用户的授权。如果用户把自己的QQ账号和密码告诉今日头条,那么今日头条就能访问用户存储在QQ服务器上的所有数据,并且用户只有修改了密码才能收回权限,这种授权方式安全隐患很大,如果使用OAuth协议就能很好的解决这一问题。  

OAuth2的四种授权模式

        OAuth2协议一共支持四种不同的授权模式:

  • 授权码模式:常见的第三方平台登录功能基本都是使用这种模式
  • 简化模式:简化模式是不需要第三方服务端参与,直接在浏览器中向授权服务器申请令牌(token),如果网站是纯静态的页面,则可以采用这种方式
  • 密码模式:密码模式是用户把用户名/密码直接告诉客户端,客户端使用这些信息向授权服务器申请令牌(token)。这需要用户对客户端高度的信任,例如客户端应用和服务
  • 客户端模式:客户端模式是指客户使用自己的名义而不是用户的名义向服务器提供者申请授权。但是,对于开发者而言,在一些为移动端提供的授权服务器上使用这种模式还是非常方便的

         从图中我们可以看出OAuth2中包含四种不同的角色:

  • Clinet:第三方应用
  • Resource Owner:资源拥有者
  • Authenorization Server:授权服务器
  • Resource Server:资源服务器

授权码模式

        授权码模式(Authorization Code)是最安全且使用最广泛的一种OAuth2授权模式,同时也是最复杂的一种授权模式,其具体的授权流程如下:

         整个流程图看起来有点复杂,这里结合王松老师的一个案例来学习:假设现在想给www.javaboy.org这个网站引入Github第三方登录功能,如果使用OAuth2协议中的授权码模式,那么流程应该是这样的:

        首先www.javaboy.org这个网站相当于一个第三方应用,该网站的首页上会放置一个登陆连接,用户(服务方的用户,这里指的是Github用户)单击这个连接,就会请求授权服务器(这里指的是Github授权服务器)。

        www.javaboy.org网站首页的登录超链接可能是下面这样的:

https://github.com/oauth/authorize?response_type=code&client_id=javaboy&redirect_uri=www.javaboy.org&scope=all&state=123

        这个连接中的参数比较多,我们一一解释下:

  • response_type:该参数表示授权类型,使用授权码模式的时候这里固定为code,表示要求反馈授权码,拿到授权码之后,在根据授权码去获取AccessToken
  • client_id:该参数表示客户端id,也就是第三方应用的id。这里是相当于Github来说的,需要到Github平台上去申请 (需要去Github平台去注册,注册地址:https://github.com/settings/developers)
  • redirect_uri:该参数表示在登录校验成功/失败后跳转的地,即校验成功后,跳转到该页面。跳转的时候,还会携带上一个授权码参数,开发者在根据这个授权码获取AccessToken
  • scope:该参数表示授权范围,即www.javaboy.org这个第三方应用拿到AccessToken能干什么
  • state:授权服务器会原封不动的返回该参数,通过对该参数的校验,可以防止CSRF攻击

       当用户单击登录超链接时,系统会将用户导入授权服务器的登录页 面;用户选择是否给予授权;如果用户同意授权,则授权服务器会将页面 重定向到redirect_uri指定的地址,同时携带一个授权码参数(如果一开 始的链接提供了state参数,这里也会将state参数原封不动返回);获取到的授权码,再结合自有 的client_id和grant_type、redirect_uri等参数,向授权服务器请求令牌, 这一步是在客户端的后端进行的,对用户不可见;授权服务器对参数进行校验之后,会返回Access Token和 Refresh Token。

        这就是授权码模式的工作流程。一般认为授权码模式是四种模式中 最安全的一种模式,因为这种模式的Access Token不用经过浏览器或者 移动端App,是直接从项目的后端获取,并从后端发送到资源服务器 上,这样就很大程度上减少了Access Token泄漏的风险。

简化模式

        对于没有后端只有页面的网站,如果想要第三方功能该怎么办呢?这就是该小结要学习的简化模式(Implicit),流程如下:

        首先在www.javaboy.org网站上有一个Github第三方登录的超链接,这个链接如下:

https://github.com/oauth/authorize?response_type=token&client_id=javaboy&redi
rect_uri=www.javaboy.org&scope=all&state=123
        这里的参数和授权码模式中的参数基本相同,只有response_type的参数值不一样,这里是token,表示要求授权服务器直接返回AccessToken。和授权码相比,这里省略了授权码那一步。

        当用户点击了登录超链接,系统会将用户导入授权服务器的登录页面。用户选择是否给与授权,如果用户同意授权则授权服务器会将页面重定向到redirect_uri指定的地址,同时在重定向的URL中添加锚点参数携带AccessToken,如下:

http://localhost:8082/index.html#access_token=9fda1800-3b57-4d32-ad01-05ff700
d44cc&token_type=bearer&expires_in=1940&state=123
这里采用锚点参数而不是URL地址参数,主要是为了避免中间人攻 击,其中token_type表示令牌类型,expires_in表示令牌过期时间,这对 应了图15-3中所示的步骤C。 接下来客户端向资源服务器发送请求,这个请求不需要携带令牌, 这对应了图15-3中所示的步骤D;资源服务器返回一段JS脚本,这对应 了图15-3中所示的步骤E;客户端执行JS脚本,提取出令牌Access Token,这对应了图15-3中所示的步骤F、步骤G。 这就是简化模式的工作流程,它的弊端很明显,因为没有后端,所 以非常不安全,除非对安全性要求不高,否则不建议使用。
​​​​​​​        

密码模式

        使用密码模式(Password)有一个前提就是高度信任第三方应用,只有高度信任第三方应用,才可以让用户在第三方应用的页面上输入登录凭证。下图是密码模式的流程:

        首先用户在第三方应用的登录页面输入登录凭证(用户名/密码)。第三方应用将用户的登录信息发送给授权服务器,获取到令牌AccessToken。授权服务器检查用户的登录信息,如果没有问题则返回AccessToken和RefreshToken。 

客户端模式

        有的应用可能没有前端页面,只有一个后台,这种时候如果要使用OAuth2,就可以考虑客户端模式(Client Credtials)。流程如下:

        客户端模式的流程很简单,只有两个步骤:

  • 客户端发送一个请求到授权服务器
  • 授权服务器通过验证后,会直接返回AccessToken给客户端

由于客户端模式是以客户端的名义向授权服务器请求令牌,所以授权服务器的令牌AccessToken颁发给客户端而非用户。

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

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

相关文章

Java+MySQL基于ssm的图书馆图书借阅管理系统

本文介绍了图书馆管理设计方案,该网站采用目前JSP中最流行的SSM框架和Eclipse编辑器、MySQL数据库设计并实现的。网站功能包含系统用户管理、图书管理、用户管理、借书管理、续借管理、违章缴款管理等模块。概述了整个系统的设计框架,介绍了系统软件开发编译环境的搭建,阐述了各…

leetcodeSQL:1445. 苹果和桔子【case when + if】

目录题目截图题目分析case when写法if写法总结题目截图 题目分析 groupby的肯定是日期怎么根据fruit类型分类呢苹果就是,orange就是-可以用case when或者if然后来一个sum就可以了注意,这里直接在select后面跟着查就可以了 case when写法 # Write your…

艾美捷硝酸盐/亚硝酸盐荧光法检测试剂盒基本参数说明

一氧化氮(NO)由神经元、内皮细胞、血小板和中性粒细胞响应于稳态刺激产生微量。这种NO被迅速清除(t4 s),并以旁分泌的方式传递细胞信号。NO与鸟苷酸环化酶的HEME辅基相互作用,激活酶并导致cGMP水平升高。其…

【十分钟学懂Linux操作系统】

🤵‍♂️ 个人主页老虎也淘气 个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏…

成本降幅达20%,效率增幅达3成,解读宝洁的供应链转型策略

从家里一部电话用N年,到手上的智能手机年年换;从单一的线下商场、超市,到随时随地的线上线下购物;从一个包裹等一个星期,到如今恨不得即买即达……短短的十年间,人们的消费习惯发生了翻天覆地的变化。数字化…

15基于峰谷分时电价引导下的电动汽车充电负荷优化(matlab程序)

参考文献 基于峰谷分时电价引导下的电动汽车充电负荷优化_欧名勇2020 主要内容 利用蒙特卡洛方法对2种不同充电方式进行模拟并对其进行分析;分析用户响应度对电动汽车有序充电的影响,建立峰谷分时电价对电动汽车负荷影响的模型&#xff0c…

Hadoop学习----MapReduceYARN

Map Reduce 1、Map Reduce的思想核心是"先分再合,分而治之" 所谓"分而治之"就是把一个复杂的问题,按照一定的"分解"方法分为等价的规模较小的若干部分,然后逐个解决,分别找出各部分的结果&#xf…

SimpleFOC移植STM32(七)—— 移植STM32F405RGT6

目录说明一、点亮LED1.1、原理图1.2、硬件准备1.3、烧写二、开环控制2.1、硬件准备2.2、硬件连接2.3、打开工程2.4、修改参数2.5、编译下载,观察运行三、角度读取3.1、硬件准备3.2、硬件连接3.3、接线说明3.4、打开工程3.5、修改代码3.6、编译下载,观察运…

超1800万累计观看,多次占据热榜前列……“无障碍字幕直播间”带来的远不止这些!

截至12月6日,世界杯无障碍字幕直播间已累计观看超1800万,多次占据热榜前列……但TA带来的远不止这些。 “过去觉得世界杯距离我太远了,熬夜看球却听不懂、听不清只能紧紧盯着屏幕;但今年无障碍字幕直播间一出,似乎一下…

Talk预告 | 腾讯AI Lab研究员童湛南京大学谈婧:基于注意力机制的视频自监督表示学习和时序动作检测

本期为TechBeat人工智能社区第465期线上Talk! 北京时间12月22日(周四)20:00,腾讯AI Lab研究员——童湛&南京大学计算机科学与技术系硕士研究生——谈婧的Talk将准时在TechBeat人工智能社区开播! 他们与大家分享的主题是: “基于注意力机制…

在华为云桌面Workspace上,启泰智能工业设计效率翻倍

中国汽车的产销总量已经连续13年稳居全球第一,在一款新车开发中,大约有2万个汽车零部件,这些零部件的研发与制造,需要大量的工厂与各行业的协作,其中模具的需求量最大。 模具行业是一个非标、离散型的行业&#xff0c…

JavaSE笔记——泛型

文章目录前言一、简单泛型1.一个元组类库2.一个堆栈类二、泛型接口三、泛型方法1.变长参数和泛型方法2.一个泛型的 Supplier3.简化元组的使用4.一个 Set 工具四、构建复杂模型五、泛型擦除1.迁移兼容性2.擦除的问题3.边界处的动作六、补偿擦除1.创建类型的实例七、边界八、通配…

【学习打卡05】可解释机器学习笔记之CAM+Captum代码实战

可解释机器学习笔记之CAMCaptum代码实战 文章目录可解释机器学习笔记之CAMCaptum代码实战代码实战介绍torch-cam工具包可视化CAM类激活热力图预训练ImageNet-1000图像分类-单张图像视频以及摄像头预测pytorch-grad-cam工具包Grad-CAM热力图可解释性分析基于Guided Grad-CAM的高…

MySql 根据中文拼音首字母排序、 分组排序

如地域表信息: 如果我们想根据NAME 字段 的值, 按照中文拼音首字母排序 : sql SELECT CODE, NAME FROM district_info ORDER BY CONVERT(name USING gbk) COLLATE gbk_chinese_ci ASC 效果很OK: 那么如果我要整成想电话簿那样&am…

【正版软件】Navicat for Oracle 数据库数管理和开发工具

前言 Navicat for Oracle 透过精简的工作环境,提高 Oracle 开发人员和管理员的效率和效率。 Navicat for Oracle 透过精简的工作环境,提高 Oracle 开发人员和管理员的效率和效率。专业化 Oracle 的开发-快速安全地创建、组织、访问和共享信息…

微信小程序自定义顶部状态栏

因为工作需要,要在微信小程序中自定义顶部导航栏,通过这篇文章来记录一下自己所得~ 第一步: 需要在json文件中配置"navigation" : "custom",完成自定义导航栏,只保留胶囊按钮,效果如下图&#x…

养殖废水生化后氨氮400mg/L做到15mg/L,有什么降氨氮的工艺?

水产养殖过程中,鱼的排泄物和没有被消耗的饲料降解均会使水中的氨氮剧增,当氨氮浓度大于0.2mg/L时,鱼类摄食就会受到严重影响,造成生长不良或停止生长;达到 2mg/L时,则会造成生物的死亡,严重影响水产的养殖…

【Maven实战技巧】「插件使用专题」Maven-Archetype插件创建自定义maven项目骨架

技术推荐 自定义Archetype Maven骨架/以当前项目为模板创建maven骨架,可以参考http://maven.apache.org/archetype/maven-archetype-plugin/advanced-usage.html,详细介绍了如何快速创建和使用Archetype。 技术背景 在工作过程中必然会遇到创建项目的蛋…

最新版Crack:Xceed Ultimate Suite

Xceed Ultimate Suite 包括 160 多个适用于所有 Windows 平台的自适应、可靠和高性能控件和库的重要集合。程序前端的 UI 控件和后端的数据处理库。经常更新,并得到反应支持和开发人员的认可。 适用于所有 Windows 平台的 160 个自适应、可靠和高性能控件和库的重要…

vue-elementUI后台管理系统,已实现用户管理、菜单管理、角色管理、公司管理、权限管理、支付管理等

vue搭建后台管理界面模版(PC端) 完整代码下载地址:vue-elementUI后台管理系统 技术栈 vue2 vuex vue-router webpack ES6/7 axios elementUI 阿里图标iconfont 项目预览 http://nmgwap.gitee.io/vueproject/#/login 说明 本项目主…