原文链接:http://www.ruanyifeng.com/blog/2019/04/oauth_design.html
OAuth 2.0 是目前最流行的授权机制,用来授权第三方应用,获取用户数据。
这个标准比较抽象,使用了很多术语,初学者不容易理解。其实说起来并不复杂,下面我就通过一个简单的类比,帮助大家轻松理解,OAuth 2.0 到底是什么。
一、快递员问题
我住在一个大型的居民小区。
小区有门禁系统。
进入的时候需要输入密码。
我经常网购和外卖,每天都有快递员来送货。我必须找到一个办法,让快递员通过门禁系统,进入小区。
如果我把自己的密码,告诉快递员,他就拥有了与我同样的权限,这样好像不太合适。万一我想取消他进入小区的权力,也很麻烦,我自己的密码也得跟着改了,还得通知其他的快递员。
有没有一种办法,让快递员能够自由进入小区,又不必知道小区居民的密码,而且他的唯一权限就是送货,其他需要密码的场合,他都没有权限?
二、授权机制的设计
于是,我设计了一套授权机制。
第一步,门禁系统的密码输入器下面,增加一个按钮,叫做"获取授权"。快递员需要首先按这个按钮,去申请授权。
第二步,他按下按钮以后,屋主(也就是我)的手机就会跳出对话框:有人正在要求授权。系统还会显示该快递员的姓名、工号和所属的快递公司。
我确认请求属实,就点击按钮,告诉门禁系统,我同意给予他进入小区的授权。
第三步,门禁系统得到我的确认以后,向快递员显示一个进入小区的令牌(access token)。令牌就是类似密码的一串数字,只在短期内(比如七天)有效。
第四步,快递员向门禁系统输入令牌,进入小区。
有人可能会问,为什么不是远程为快递员开门,而要为他单独生成一个令牌?这是因为快递员可能每天都会来送货,第二天他还可以复用这个令牌。另外,有的小区有多重门禁,快递员可以使用同一个令牌通过它们。
三、互联网场景
我们把上面的例子搬到互联网,就是 OAuth 的设计了。
首先,居民小区就是储存用户数据的网络服务。比如,微信储存了我的好友信息,获取这些信息,就必须经过微信的"门禁系统"。
其次,快递员(或者说快递公司)就是第三方应用,想要穿过门禁系统,进入小区。
最后,我就是用户本人,同意授权第三方应用进入小区,获取我的数据。
简单说,OAuth 就是一种授权机制。数据的所有者告诉系统,同意授权第三方应用进入系统,获取这些数据。系统从而产生一个短期的进入令牌(token),用来代替密码,供第三方应用使用。
四、令牌与密码
令牌(token)与密码(password)的作用是一样的,都可以进入系统,但是有三点差异。
(1)令牌是短期的,到期会自动失效,用户自己无法修改。密码一般长期有效,用户不修改,就不会发生变化。
(2)令牌可以被数据所有者撤销,会立即失效。以上例而言,屋主可以随时取消快递员的令牌。密码一般不允许被他人撤销。
(3)令牌有权限范围(scope),比如只能进小区的二号门。对于网络服务来说,只读令牌就比读写令牌更安全。密码一般是完整权限。
上面这些设计,保证了令牌既可以让第三方应用获得权限,同时又随时可控,不会危及系统安全。这就是 OAuth 2.0 的优点。
注意,只要知道了令牌,就能进入系统。系统一般不会再次确认身份,所以令牌必须保密,泄漏令牌与泄漏密码的后果是一样的。 这也是为什么令牌的有效期,一般都设置得很短的原因。
OAuth 2.0 对于如何颁发令牌的细节,规定得非常详细。具体来说,一共分成四种授权类型(authorization grant),即四种颁发令牌的方式,适用于不同的互联网场景。下一篇文章,我就来介绍这四种类型,并给出代码实例。
(完)
相关推荐
OAuth 2.0 协议中的技术术语多样,为了避免混淆,作者整理出了一个重要的中英对照表,包括云计算、第三方、应用程序、私有证书、身份验证、授权、明文、客户端、服务器、资源拥有者、受保护资源、资源服务器、访问...
2. **客户端应用代码**:提供了一个简单的客户端应用示例,展示了如何与CAS服务器交互,获取和使用OAuth2.0令牌。 3. **测试用例**:可能包含了一些自动化测试脚本,用来验证OAuth2.0集成是否正常工作。 4. **文档...
OAuth2.0是OAuth协议的延续版本,但不向前兼容OAuth 1.0(即完全废止了OAuth1.0)。 OAuth 2.0关注客户端开发者的简易性。要么通过组织在资源拥有者和HTTP服务商之间的被批准的交互动作代表用户,要么允许第三方应用...
OAuth2.0是一种授权框架,它允许第三方应用在用户的许可下访问其私有资源,而无需获取用户的用户名和...这个“OAuth2.0新浪微博简单示例”为学习这一框架提供了一个直观的起点,帮助开发者快速上手并应用于实际项目。
OAuth2.0是一个授权框架,允许第三方应用在用户授权的情况下访问其受保护的资源,而无需知道用户的原始凭证。以下是关于这个主题的详细知识点: 1. **OAuth2.0核心概念**: - **客户端(Client)**: 需要访问受...
在"springboot OAuth2.0-demo"这个项目中,开发者已经实现了一个简单的OAuth2.0授权流程的示例。这个项目可能包含以下组件: - `AuthorizationServerConfig`:配置OAuth2.0授权服务器,定义令牌策略和范围。 - `...
这个压缩包文件很可能包含了一个基于Java的Web框架JFinal实现的OAuth2.0登录示例项目。JFinal是一个轻量级的MVC框架,它简化了上述流程的实现,提供了对OAuth2.0协议的支持。项目可能包含了各个平台的配置文件、...
OAuth2.0 简单介绍文档 OAuth(开放授权)是一种授权协议,允许第三方应用在用户同意的情况下,安全地访问存储在另一服务提供商上的用户资源,而无需共享用户的用户名和密码。OAuth1.0 和 OAuth2.0 是两个主要的...
OAuth2.0作为一种开放标准协议,其设计初衷是为了允许用户授权一个应用程序访问他们存储在另一个服务上的信息,而无需分享自己的凭证。这种机制使得数据和服务能够在不同的应用程序之间无缝流动,同时也保障了用户...
OAuth2.0是一种开放的协议,为桌面程序或者Web应用提供了一种简单的、标准的方式去访问受保护的资源。OAuth 认证授权具有简单、安全、开放的特点。OAuth 2.0 关注客户端开发者的简易性,同时为 Web 应用、桌面应用和...
OAuth2.0 是一个广泛使用的授权框架,用于允许第三方应用访问用户在特定服务上的资源,而无需获取用户的原始密码。在实际开发中,由于 OAuth2.0 的接口通常依赖于用户权限管理(UPMS)和其他组件,进行单元测试时会...
接下来,我们需要创建一个 OAuth2.0 服务器实例,定义客户端信息、授权类型、令牌类型等。 ```javascript const oauth = require('express-oauth-server'); const server = new oauth({ model: { // 这里需要...
3、封装Model,用户信息Model(SinaMUsers.cs) 4、含有一个简单的实例,更快速容易的使用接口。 5、使用日志记录。日志文件路径直接在配置文件(Wbm.QzoneV2.config)里修改。 6、拥有一个网站可以部署多个应用功能...
OAuth 2.0 是目前比较流行的做法,它率先被...2.0,是因为最初有一个1.0协议,但这个1.0协议被弄得太复杂,易用性差,所以没有得到普及。2.0是一个新的 设计,协议简单清晰,但它并不兼容1.0,可以说与1.0没什么关系。
OpenID Connect则是在OAuth2.0的基础上构建的一个身份层,它提供了一种简单的方式来验证用户身份,并且获取基本的用户信息。OpenID Connect允许用户通过单一登录(Single Sign-On, SSO)的方式访问多个服务,而无需...
OAuth 2.0 是一种广泛使用的开放标准授权框架,它允许第三方应用安全地访问用户的受...通过学习“OAuth 2.0 的一个简单解释.mhtml”和“OAuth 2.0 的四种方式.mhtml”,你可以深入理解这一授权协议的细节和应用场景。
OAuth2.0是一个授权框架,它允许第三方应用在用户授权下访问其存储在服务提供商上的资源,而无需获取用户的登录凭据。这个框架主要包括四个角色:资源所有者(User)、资源服务器(Resource Server)、客户端...
在这个"OAuth2.0授权实例"中,我们将探讨如何实现一个简单的登录功能。 首先,理解OAuth2.0的核心概念: 1. **资源所有者(Resource Owner)**:即用户,拥有想要被访问的资源。 2. **客户端(Client)**:第三方...