原文链接: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),即四种颁发令牌的方式,适用于不同的互联网场景。下一篇文章,我就来介绍这四种类型,并给出代码实例。
(完)
相关推荐
springboot 集成oauth2.0服务器,基于oauth2.0授权码形式集成
OAuth2.0是OAuth协议的延续版本,但不向前兼容OAuth 1.0(即完全废止了OAuth1.0)。 OAuth 2.0关注客户端开发者的简易性。要么通过组织在资源拥有者和HTTP服务商之间的被批准的交互动作代表用户,要么允许第三方应用...
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没什么关系。
使用node.js实现OAuth2.0的一个非常简单的演示
帮助新手学习OAuth的一个很好的示例 http://blog.csdn.net/koastal/article/details/50282509
包括三个简单的项目以及mybatis用于自动生成bean、dao、mapping所需的文件,项目分别为:学习OAuth2的入门首选。 1、ssm的简单搭建。 2、oauth2.0的客户端。 3、oauth2.0的服务端。
oauth2.0第三方 qq、sina、baidu、renren、osc、豆瓣 等,登陆的简易封装!
对oauth1.0和2.0的协议流程和相关技术要求进行了简单介绍
新浪微博C#版SDK Demo 包含获取个人信息、获取会员好友信息、常用的api 分装集成。简单易懂,不管你是高手还是菜鸟都适用。
在整理大部分同学的需求时候,迫切需要一个小而专的微服务系统。 全面兼容Spring Cloud 最新GA版本 Spring Boot 2.0.8.RELEASE 、Spring Cloud Finchley.SR2 、Spring Security OAuth2 1. 减少中间件依赖 2.0 ...
这个项目的想法是编写一个简单的 OAuth 2.0 授权服务器。 不要期望太多。 它正在逐步发展。 代码看起来不太好。 很多东西都是硬编码的。 它更像是一个简单的概念证明应用程序。规格本项目使用以下 RFC 文档作为其...
您可以轻松地配置OAuth 2.0服务器PHP OAuth 2.0服务器联盟/ oauth2-server是用PHP编写的OAuth 2.0授权服务器的标准兼容实现,这使得与OAuth 2.0的配合变得很简单。 您可以轻松地配置OAuth 2.0服务器,以使用访问令牌...
包括三个简单的项目以及mybatis用于自动生成bean、dao、mapping所需的文件,项目分别为: 1、ssm的简单搭建。 2、oauth2.0的客户端。 3、oauth2.0的服务端。
OAuth2.0授权实例,实现简单登录
简单实用的获取微信公众号用户的信息 /* *微信认证获取openid部分: *临时认证code */ //微信认证部分:第二步 获得code string code = Request["code"]; if (string.IsNullOrEmpty(code)) { //如果code没...
OAuth 2.0入门文档,简单易懂,方便新手入门。注意是英文版。
4、含有一个简单的实例,更快速容易的使用接口。 5、使用日志记录。日志文件路径直接在配置文件(Wbm.SinaV2.config)里修改。 6、拥有一个网站可以部署多个应用功能,只需要在配置文件添加app节点即可。 【体验...
node-oauth2-provider, 一个简单的可以定制 OAuth 2.0提供程序( 服务器) 用于 node.js 用于连接 & Express的OAuth 2提供商这是用于实现支持服务器端( 代码) 和客户端( 令牌) OAuth流的OAuth2服务器( 提供者)的node....