OAUTH开放授权
OAUTH开放授权
OAUTH开放授权为用户资源的授权提供了一个安全的、开放而又简易的标准。OAUTH的授权不会使第三方触及到用户的帐号信息例如用户名与密码等,即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAUTH授权是安全的,目前OAUTH的版本为2.0。
实例
假如此时有一个网站提供照片的冲印服务并且提供邮递服务,但是用户的所有照片都存储在Google网盘中,此用户如果想冲印大量照片,那么有以下几种解决方案:
- 登录用户自己的
Google账号,将所有需要打印的照片下载到本地,然后上传照片到云冲印网站,交予网站任务让其帮你冲印。这种解决方案是可行的,但是需要将照片下载后再上传,比较麻烦。 - 将自己的
Google账号密码告知冲印网站,然后冲印网站读取照片,此后用户选择读取的照片再交予网站进行打印服务。这种解决方案非常不可靠,冲印网站此时能够接触到用户的账号与密码,不排除其在后端服务器保存账号密码的可能。冲印网站只是需要读取照片数据,而此时冲印网站有了跟用户一样的权力,对于Google账号中保存的数据全部可以获取到,扩大了冲印网站的权力。假如所有的需要Google授权的网站都是以告知账号密码的形式进行授权,用户若想收回对于这个网站的授权,只能通过修改密码的方式,而此时所有的对于其他网站的授权将全部失效。若是授权网站以明文的形式记录了用户授权的网站的账号与密码,一旦数据库被攻陷,那么用户信息就将全部泄露。此外不排除网站进行钓鱼欺骗用户账号密码的嫌疑,实际上通过赠送物品而骗取用户账号密码是钓鱼网站常用的手段。 - 使用
OAUTH开放授权,通过用户授权照片冲印网站能够获得的数据范围,而对于其他的数据则不给予其访问权限,用户的授权行为全部在Google的授权网站中进行,即使用户在授权时未登录Google需要账号密码登录时也是在Google官方网站进行,冲印网站无法得到用户账号与密码,当用户在Google授权页面将读取照片的权限给予冲印网站后,冲印网站便可读取照片信息然后进行冲印服务。简单来说OAuth就是一种授权机制,数据的所有者告诉系统,同意授权第三方应用进入系统,获取这些数据,系统从而产生一个短期的进入令牌token,用来代替密码,供第三方应用获取资源使用。
授权过程
名词定义
Third-party application:第三方应用程序,例如上文中的云冲印网站。HTTP service: 服务提供商,例如上文中的Google。User Agent: 用户代理,一般都是使用浏览器。Authorization server: 认证服务器,服务提供商用来处理认证的服务器。Resource server: 资源服务器,即服务提供商存放用户资源的服务器。
基本流程
- 用户打开应用程序,应用程序要求用户给予授权。
- 用户在服务提供商网站允许授权,返回应用程序授权信息。
- 应用程序使用获得的授权,向认证服务器请求令牌
Token。 - 认证服务器对于应用程序的授权码等信息进行确认,认证无误后发放令牌。
- 应用程序使用令牌向资源服务器请求资源。
- 资源服务器确认令牌无误后,同意向应用程序开放资源。
客户端授权模式
在基本流程的第二步应用程序需要获取用户的授权信息,进而才能获取令牌,OAuth 2.0定义了四种授权方式。
授权码模式
授权码模式authorization code是功能最完整、流程最严密的授权模式,也是最常用的授权模式,它的特点就是通过客户端的后台服务器与服务提供商的认证服务器进行互动,避免了令牌Token在前端传输,前端只传递一个授权码,而授权码需要结合Appid与AppSecret等信息在后端与认证服务器交换令牌Token,而AppSecret此类数据需要严格保密,所以仅由CODE不能直接获取到令牌,授权码模式安全性非常高。
- 用户打开应用程序,点击第三方授权按钮,此时需要传递应用程序的
APPID以及授权后跳转的URL地址,页面跳转到授权网站,或者打开一个新的窗口到授权网站,本例主要是以跳转到授权网站为例,但基本流程相同。 - 用户在授权网站点击授权按钮,此时浏览器跳转到上一部传递的
URL地址并且携带授权码CODE信息,这个授权码信息一般有效期比较短,一般为10分钟。 - 应用程序收到授权码,将授权码
CODE发送到后端,后端根据授权码CODE以及Appid与AppSecret等信息在后端对认证服务器发起请求。 - 认证服务器检查请求的数据是否正确,检查正确后返回令牌
Token。 - 应用程序使用令牌向资源服务器请求资源,资源服务器确认令牌无误后,同意向应用程序开放资源。
简化模式
简化模式implicit grant type不通过第三方应用程序的服务器,直接在浏览器中向认证服务器申请令牌,跳过了授权码这个步骤。所有步骤在浏览器中完成,令牌对访问者是可见的,且客户端不需要认证。
- 用户打开应用程序,点击第三方授权按钮,此时需要传递应用程序的
APPID以及授权后跳转的URL地址,页面跳转到授权网站,或者打开一个新的窗口到授权网站,本例主要是以跳转到授权网站为例,但基本流程相同。 - 用户在授权网站点击授权按钮,此时浏览器跳转到上一部传递的
URL地址并且携带一个HASH信息,其中包含了令牌。 - 浏览器向资源服务器发起请求,此时不携带上一步请求的
HASH信息,资源服务器返回一个解析脚本。 - 浏览器解析上一步获取的脚本,然后通过脚本解析出
HASH中的令牌,此时应用程序获取了令牌。 - 应用程序使用令牌向资源服务器请求资源,资源服务器确认令牌无误后,同意向应用程序开放资源。
密码模式
密码模式Resource Owner Password Credentials Grant中,用户向客户端提供自己的用户名和密码,客户端使用这些信息,向服务商提供商索要授权。在这种模式中,用户必须把自己的密码给客户端,但是客户端不得储存密码,这通常用在用户对客户端高度信任的情况下,比如客户端是操作系统的一部分,而认证服务器只有在其他授权模式无法执行的情况下,才能考虑使用这种模式。
- 用户向应用程序提供用户名与密码,应用程序使用账号与密码发给认证服务器,请求令牌。
- 认证服务器确认信息无误后,返回令牌给应用程序。
- 应用程序使用令牌向资源服务器请求资源,资源服务器确认令牌无误后,同意向应用程序开放资源。
客户端模式
客户端模式Client Credentials Grant指客户端以自己的名义,而不是以用户的名义,向服务提供商进行认证。在这种模式中,用户直接向客户端注册,客户端以自己的名义要求服务提供商提供服务,严格来说这种模式其实并不存在授权问题。
- 用户在应用程序中注册身份,应用程序向认证服务器进行身份认证并请求令牌。
- 认证服务器确认身份无误后,返回令牌给应用程序。
- 应用程序使用令牌向资源服务器请求资源,资源服务器确认令牌无误后,同意向应用程序开放资源。
每日一题
https://github.com/WindrunnerMax/EveryDay
参考
https://zhuanlan.zhihu.com/p/138424479
http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html
http://www.ruanyifeng.com/blog/2019/04/oauth_design.html
OAUTH开放授权的更多相关文章
- OAuth 开放授权
什么是OAuth授权? 一.什么是OAuth协议 OAuth(开放授权)是一个开放标准. 允许第三方网站在用户授权的前提下访问在用户在服务商那里存储的各种信息. 而这种授权无需将用户提供用户名和密 ...
- 第三方登录(1)OAuth(开放授权)简介及授权过程
3个角色:服务方,开发者,用户 a.用户在第在服务注册填写个人信息, b.服务方开放OAuth, c.开发者在服务方申请第3方登录,在程序中得到令牌后,经用户同意,可得到用户的个人信息. OAuth ...
- OAuth 开放授权 Open Authorization
http://oauth.net/ http://tools.ietf.org/html/rfc6749 http://reg.163.com/help/help_oauth2.html 网易通行证O ...
- OAuth机制原理(开放授权机制)
1.简述 OAuth(Open Authorization,开放授权)是为用户资源的授权定义了一个安全.开放及简单的标准,第三方无需知道用户的账号及密码,就可获取到用户的授权信息,并且这是安全的. 国 ...
- OAuth(开放授权)
HTTP Basic Auth HTTP Basic Auth简单点说明就是每次请求API时都提供用户的username和password,简言之,Basic Auth是配合RESTful API 使 ...
- 安全系列之二:OAuth2.0 开放授权协议
本文提取出OAuth2.0规范RFC6749的主要内容,部分内容从文档复制出来,给大家讲讲第三方授权背后的故事. 先是举个知乎的QQ登录授权的例子,然后讲四种授权方式,两种令牌,接着是看看协议流程,分 ...
- OAuth2:隐式授权(Implicit Grant)类型的开放授权
适用范围 仅需临时访问的场景 用户会定期在API提供者那里进行登录 OAuth客户端运行在浏览器中(Javascript.Flash等) 浏览器绝对可信,因为该类型可能会将访问令牌泄露给恶意用户或应用 ...
- OAuth2:客户端证书授权(Client Credentials)类型的开放授权
适应范围 认证服务器不提供像用户数据这样的重要资源,仅仅是有限的只读资源或者一些开放的API.例如使用了第三方的静态文件服务,如Google Storage或Amazon S3.这样,你的应用需要通过 ...
- 在WebApi中基于Owin OAuth使用授权发放Token
如何基于Microsoft.Owin.Security.OAuth,使用Client Credentials Grant授权方式给客户端发放access token? Client Credentia ...
随机推荐
- 《Arduino实战》——3.4 小结
本节书摘来异步社区<Arduino实战>一书中的第3章,第3.4节,作者:[美]Martin Evans ,Joshua Noble ,Jordan Hochenbaum,更多章节内容可以 ...
- vue父组件向子组件传对象,不实时更新解决
vue报错:void mutating a prop directly since the value will be overwritten whenever the parent componen ...
- W - Doom HDU - 5239 线段树 找取模的规律+求一个很大的数的平方对一个数取模的写法 特别的模数==2^63-2^31
这个题目一开始感觉还是有点难的,这个模数这么大,根本就不知道怎么写,然后去搜了题解,知道了怎么去求当x很大的时候x的平方对一个数取模怎么样不会爆掉. 然后还顺便发现了一个规律就是当一个数更新一定次数之 ...
- bootstrap4中bootstrap_treeview不显示图标原因以及解决办法
1.bootstrap4中bootstrap_treeview不显示图标原因 查看过大神的博客,经过自己试验,插件依赖: bootstrap/3.3.7 jquery/3.3.1 <link h ...
- Android自定义顶部栏及侧滑菜单和fragment+viewpag滑动切换的实现
嘿嘿嘿,关于android滑动的操作,是不是经常都会用到呢. 我肯定也要学习一下啦. https://blog.csdn.net/u013184970/article/details/82882107 ...
- 【Hadoop离线基础总结】HDFS的API操作
HDFS的API操作 创建maven工程并导入jar包 注意 由于cdh版本的所有的软件涉及版权的问题,所以并没有将所有的jar包托管到maven仓库当中去,而是托管在了CDH自己的服务器上面,所以我 ...
- STM32 使用IQmath实现SVPWM
IQMATH TI的片子很香,做的也很好,但是成本相对ST会更高,电机控制方面,TI无疑是做的最好的方案之一,另外TI针对没有浮点运算器的定点DSP推出了IQMATH库,在使用Q格式对数据进行分析和处 ...
- Linux下ffmpeg交叉编译
1 获取源代码 git clone -b "branch" https://git.ffmpeg.org/ffmpeg.git "branch" 可以是以下的m ...
- SVN 分支代码合并到主线
SVN 分支代码合并到主线 步骤一安装TortoiseSVN 客户端,在本地 checkout主线代码 步骤二:创建branches分支 步骤三.branches修改提交代码 步骤四:分支代码合并到主 ...
- [zoj3623]背包模型
给定n种物品,每种物品需要ti时间生产出来,生产出来以后,每单位时间可以创造wi个价值.如果需要创造至少W个价值,求最少时间. 思路:dp[j]表示用时间j所能创造的最大价值,则有转移方程:dp[j ...