【OAuth2】:赋予用户控制权的安全通行证--原理篇

🥳🥳Welcome Huihui's Code World ! !🥳🥳

接下来看看由辉辉所写的关于OAuth2的相关操作吧 

目录

🥳🥳Welcome Huihui's Code World ! !🥳🥳

一.什么是OAuth?

二.为什么要用OAuth?

三.  OAuth2的四种授权模式

1. 隐式授权模式(Implicit Grant)

2. 授权码授权模式(Authorization code Grant)

3. 密码模式(Resource Owner Password Credentials Grant)

4. 客户端凭证模式(Client Credentials Grant)

四.关于授权码授权模式的详细讲解

1.流程说明

2.模拟过程

3.实例说明


一.什么是OAuth?

        OAuth 不是一个API或者服务,而是一个验证授权(Authorization)的开放标准,所有人都有基于这个标准实现自己的OAuth。

        更具体来说,OAuth是一个标准,app可以用来实现secure delegated access. OAuth基于HTTPS,以及APIs,Service应用使用access token来进行身份验证。

        OAuth主要有OAuth 1.0a和OAuth 2.0两个版本,并且二者完全不同,且不兼容。OAuth2.0 是目前广泛使用的版本,我们多数谈论OAuth时,为OAuth2.0

二.为什么要用OAuth?

        在OAuth之前,HTTP Basic Authentication, 即用户输入用户名,密码的形式进行验证, 这种形式是不安全的。OAuth的出现就是为了解决访问资源的安全性以及灵活性。OAuth使得第三方应用对资源的访问更加安全。

        可能这样讲,大家会觉得不生动,那么我接下来举一个生活中的例子让大家能够更快的去理解要使用oauth的原因

假设我住在一个大型的居民小区。

小区有门禁系统。

进入的时候需要输入密码,或者扫码。

我经常网购和外卖,每天都有快递员来送货。我必须找到一个办法,让快递员通过门禁系统,进入小区。

如果我把自己的密码,告诉快递员,他就拥有了与我同样的权限,这样好像不太合适。万一我想取消他进入小区的权力,也很麻烦,我自己的密码也得跟着改了,还得通知其他的快递员。

有没有一种办法,让快递员能够自由进入小区,又不必知道小区居民的密码,而且他的唯一权限就是送货,其他需要密码的场合,他都没有权限?

于是,我设计了一套授权机制。

第一步,门禁系统的密码输入器下面,增加一个按钮,叫做"获取授权"。快递员需要首先按这个按钮,去申请授权。

第二步,他按下按钮以后,屋主(也就是我)的手机就会跳出对话框:有人正在要求授权。系统还会显示该快递员的姓名、工号和所属的快递公司。

我确认请求属实,就点击按钮,告诉门禁系统,我同意给予他进入小区的授权。

第三步,门禁系统得到我的确认以后,向快递员显示一个进入小区的令牌(access token)。令牌就是类似密码的一串数字,只在短期内(比如七天)有效。

第四步,快递员向门禁系统输入令牌,进入小区。

有人可能会问,为什么不是远程为快递员开门,而要为他单独生成一个令牌?这是因为快递员可能每天都会来送货,第二天他还可以复用这个令牌。另外,有的小区有多重门禁,快递员可以使用同一个令牌通过它们。【大概的步骤就是下方图片所示】

综上,可知OAuth 就是一种授权机制。数据的所有者告诉系统,同意授权第三方应用进入系统,获取这些数据。系统从而产生一个短期的进入令牌(token),用来代替密码,供第三方应用使用。

三.  OAuth2的四种授权模式

1. 隐式授权模式(Implicit Grant)

  •  第一步:用户访问页面时,重定向到认证服务器。
  •  第二步:认证服务器给用户一个认证页面,等待用户授权。
  •  第三步:用户授权,认证服务器想应用页面返回Token
  •  第四步:验证Token,访问真正的资源页面

2. 授权码授权模式(Authorization code Grant)

  •  第一步:用户访问页面
  •  第二步:访问的页面将请求重定向到认证服务器
  •  第三步:认证服务器向用户展示授权页面,等待用户授权
  •  第四步:用户授权,认证服务器生成一个code和带上client_id发送给应用服务器
    • 然后,应用服务器拿到code,并用client_id去后台查询对应的client_secret
  •  第五步:将code、client_id、client_secret传给认证服务器换取access_token  和 refresh_token
  •  第六步:将access_token和refresh_token传给应用服务器
  •  第七步:验证token,访问真正的资源页面

3. 密码模式(Resource Owner Password Credentials Grant)

  •  第一步:用户访问用页面时,输入第三方认证所需要的信息(QQ/微信账号密码)
  •  第二步:应用页面那种这个信息去认证服务器授权
  •  第三步:认证服务器授权通过,拿到token,访问真正的资源页面

优点:不需要多次请求转发,额外开销,同时可以获取更多的用户信息。(都拿到账号密码了)

缺点:局限性,认证服务器和应用方必须有超高的信赖。(比如亲兄弟?)

应用场景:自家公司搭建的认证服务器

4. 客户端凭证模式(Client Credentials Grant)

  •  第一步:用户访问应用客户端
  •  第二步:通过客户端定义的验证方法,拿到token,无需授权
  •  第三步:访问资源服务器A
  •  第四步:拿到一次token就可以畅通无阻的访问其他的资源页面。

这是一种最简单的模式,只要client请求,我们就将AccessToken发送给它。这种模式是最方便但最不安全的模式。因此这就要求我们对client完全的信任,而client本身也是安全的。

因此这种模式一般用来提供给我们完全信任的服务器端服务。在这个过程中不需要用户的参与

四.关于授权码授权模式的详细讲解

我们在实战中,用的最多的就是授权码的授权模式,这个模式相对来说用的比较多,所以我们再详细的讲解一下他的流程

1.流程说明

1、用户访问客户端
2、客户端将用户导向认证服务器
3、用户登录,并对第三方客户端进行授权
4、认证服务器将用户导向客户端事先指定的重定向地址,并附上一个授权码
5、客户端使用授权码,向认证服务器换取令牌
6、认证服务器对客户端进行认证以后,发放令牌
7、客户端使用令牌,向资源服务器申请获取资源
8、资源服务器确认令牌,向客户端开放资源

2.模拟过程

  • 流程说明

    • 资源拥有者打开客户端,客户端要求资源拥有者给予授权,它将浏览器被重定向到授权服务器,重定向时会附加客户端的身份信息。如:

/server/oauth2/authorize? client_id=test&response_type=code&scope=app&redirect_uri=http://xx.xx/notify

client_id:客户端接入标识。

response_type:授权码模式固定为code。

scope:客户端权限。

redirect_uri:跳转uri,当授权码申请成功后会跳转到此地址,并在后边带上code参数(授权码)。例如:xx.xx/notify?code…

  • 浏览器出现向授权服务器授权页面,之后将用户同意授权。

  • 授权服务器将授权码(AuthorizationCode)转经浏览器发送给client(通过redirect_uri传递,url后面拼接参数)。

  • 客户端拿着授权码向授权服务器索要访问access_token,请求如下:

    /server/oauth2/token? client_id=test&client_secret=gdjbcd&grant_type=authorization_code&code=qwe12&redirect_uri=http://xx.xx/notify

    client_id:客户端准入标识。

    client_secret:客户端秘钥。

    grant_type:授权类型,填写authorization_code,表示授权码模式 code:授权码,就是刚刚获取的授权码,注意:授权码只使用一次就无效了,需要重新申请。

    redirect_uri:申请授权码时的跳转url,一定和申请授权码时用的redirect_uri一致

  • 授权服务器返回令牌(access_token)

这种模式是四种模式中最安全的一种模式。一般用于Web服务器端应用或第三方的原生App调用资源服务的时候。 因为在这种模式中access_token不会经过浏览器或移动端的App,而是直接从服务端去交换,这样就最大限度的减 小了令牌泄漏的风险

3.实例说明

后续的几个步骤都是在后端完成的,我们在前端无法演示了

好啦,今天的分享就到这了,希望能够帮到你呢!😊😊   

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

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

相关文章

坚持建设国家自主信息体系,龙芯中科胡伟武“419”论坛畅谈LoongArch生态建设蓝图...

4月19日,第五届关键信息基础设施自主安全创新论坛在北京召开,这也是龙芯中科正式发布自主指令系统LoongArch一周年之际。在本次论坛上,龙芯中科董事长胡伟武发表了《龙架构(LoongArch)生态建设》的演讲,围绕…

(十)python3 只需3小时带你轻松入门——模块与包

模块 一般情况下,是一个以.py为后缀的文件。使用import导入。我们创建一个py文件,名为myprint,该py文件作为模块,在里面定义一个函数名为myprint: def myprint():print(这是我的print模块)保存后,在同目录…

【ArcGIS风暴】ArcGIS 10.6创建规则格网(渔网fishnet)图文经典详解

GIS中常常需要地图分幅与编号,或者需要按照规则格网(三角网、矩形网等)去批量裁剪或提取矢量和栅格数据,相关内容可以参看下面的文章。本文主要详细讲解ArcGIS10.6软件中创建渔网的方法,为地图分幅或规则裁剪做好数据准备。 ArcGIS批量裁剪提取或分幅方法总结参考文章: 《…

计算机转财经专业考试考什么,高三对口升学第三次模拟考试财经基础课计算机专业课...

商丘市三高2012-2013学年度第二学期第五次模考《计算机专业专业课》试卷一、选择题(每小题2分,共100分。)1、在Access中,建立的数据库文件的扩展名为()。(A)dbt (B)dbf (C)mdf (D)mdb2、如果“通讯录”表和“籍贯”表通过各自的“籍贯代码”字段建立了一…

linux之wget和curl如何携带cookie进行链接访问

1 问题 wget和curl如何携带cookie进行链接访问 2 解决办法 1) curl携带cookie curl --cookie "key=value" "链接地址" 这里的链接一定要加上双引号,如果链接太长,可能有问题. 如下 curl --cookie "name=zhangsan" "http://localhost…

xshell通过隧道连接_DNS安全之隧道攻击

DNS隧道攻击原理:即协议封装,IP over DNS,将其他协议封装在合法的dns请求和应答报文中,clent端通过构造特殊的域名记录请求发送数据给server,server端通过构造特殊的txt记录值来回应数据给client。其特点:请…

C#内建接口:IEquatable泛型

这节来讲一下泛型接口:IEquatable。IEquatable泛型接口处于System.Runtime命名空间下,最早在.NET Framework 2.0中发布,只有泛型版本。像之前我们讲过的IComparable,IEnumerable接口,它们属于是1.0时期的内建接口&…

联想台式计算机 不启动u盘,新电脑不识别u盘启动盘?不用送修,自己就能搞定!...

原标题:新电脑不识别u盘启动盘?不用送修,自己就能搞定!新买的电脑想要通过u盘启动来装系统,但是一些用户却遇到难题了,以为制作好u盘启动盘就能直接开机启动了。殊不知,很多新电脑都是预装的win…

Hadoop(三)通过C#/python实现Hadoop MapReduce

MapReduceHadoop中将数据切分成块存在HDFS不同的DataNode中,如果想汇总,按照常规想法就是,移动数据到统计程序:先把数据读取到一个程序中,再进行汇总。但是HDFS存的数据量非常大时,对汇总程序所在的服务器将…

python简介及环境安装

Python的创始人为荷兰人吉多范罗苏姆 。1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,作为ABC语言的一种继承。 Python是一种跨平台的计算机程序设计语言。 是一个高层次的结合了解释…

晋中学院计算机考研,晋中学院有多少人死在考研路上

晋中学院有多少人死在考研路上(2011-05-23 20:34:30)标签:日记杂谈有一句话叫作:长江后浪推前浪,前浪死在沙滩上,用来形容少年老成与故人的可怜。转眼间到了谋取出路的时候了,班上几乎所有的人都在那里嚷嚷的要考研,但…

解决ArcGIS 9.3卸载时出现invalid install.log file的方法

地信君都知道,ArcGIS 9.3 License卸载时常出现“invalid install.log file”的错误提示,而导致卸载失败,如下:

使用virt-install安装kvm虚拟机时需要的问题

使用virt-install安装kvm虚拟机时需要的问题今天在做kvm的实验时,使用virt-install安装虚拟机的过程中遇到了一些问题,其中有一个问题弄了好久都没有弄好,不过现在已经好了。由于我使用virt-install命令安装虚拟机的,其命令如下&a…

从同步函数 hello-world-dotnet 开始探索OpenFunction

OpenFunction[1] 是一个现代化的云原生 FaaS(函数即服务)框架,它引入了很多非常优秀的开源技术栈,包括 Knative、Tekton、Shipwright、Dapr、KEDA 等,这些技术栈为打造新一代开源函数计算平台提供了无限可能&#xff1…

还不会制作游戏脚本解放双手?那是你不会超强自动化框架AirTest!

最近朋友问我能不能写一个自动化,帮他解放一下双手。我想了想,在我知识里很多辅助脚本制作工具,想想那些可能会有一堆局限性,想到了Python有自动化测试游戏框架或者工具,但是一直没有了解,搜了下资料&#…

AirTest 基本使用及框架浅剖析——五分钟上手制作游戏辅助

简介 Airtest Project 是为编写自动化脚本,达到提升测试效率的一整套解决方案。它可以轻松的扩展到多平台、多引擎上;如基础的 Android和IOS手机应用、App;Windows上的应用等。 学习使用 Airtest Project 很容易,由于 Airtest P…

计算机组成原理xchg,8088数据传送指令-计算机组成原理与汇编语言-电子发烧友网站...

3.2.1 数据传送指令1. MOVOPRD1,OPRD2MOV是操作码,OPRD1和OPRD2分别是目的操作数和源操作数。该指令可把一个字节或一个字操作数从源地址传送到目的地址。源操作数可以是累加器、寄存器、存贮器以及立即操作数,而目的操作数可以是累加器、寄存器和存贮器…

Facebook用户遭遇千年虫:瞬间有了46年老友

一些Facebook用户今天碰到了一个有趣的bug,系统提示他们与好友有了46年长的好友关系。要知道,Facebook还不到15岁,很多用户也没有46岁的高龄。Facebook一直没有透露产生这个bug的原因,但它说已经意识到该问题。“我们已经确定了这…

(上)python3 selenium3 从框架实现代码学习selenium让你事半功倍

本文感谢以下文档或说明提供的参考。 Selenium-Python中文文档 Selenium Documentation Webdriver 参考 如有错误欢迎在评论区指出,作者将即时更改。 环境说明 操作系统:Windows7 SP1 64python 版本:3.7.7浏览器:谷歌浏览器浏览…

.NET 7 中的 HostApplicationBuilder

.NET 7 Preview 3 引入的 HostApplicationBuilderIntro在 .NET 6 中,ASP.NET Core 引入了 Minimal API,对于简单的应用使用 Minimal API 我们可以使用非常精简的代码来实现我们的 API,在 .NET 7 Preview 3 中,引入了一个 HostAppl…