OAuth 2.0
OAuth 2.0 是一个委托协议,一种让控制资源者允许软件程序以他们的名义(而不是假冒他们的名义)访问资源的方式。应用程序从资源拥有者请求权限,获取可以用来访问资源的tokens。这些都不需要应用程序去冒充拥有资源的人,因为token就代表了访问权限的委托。
某种程度上来说,你可以把OAuth token想象成网络里面的泊车钥匙。不是所有的车都有泊车钥匙,但是对于那些有的,泊车钥匙比普通钥匙提供了额外的安全性。泊车钥匙允许车主授予别人有限的使用权限,泊车钥匙不像车主的钥匙,对车有完全的控制权。简单的泊车钥匙限制泊车员访问点火装置和门,但是不能访问后备箱和杂物箱。更加复杂一点的泊车钥匙可以限制车速上限,甚至在车子开除设定距离后关闭引擎,并发送警告给车主。大致相同,OAuth tokens可以限制客户端仅仅访问资源拥有者委托的资源。
OAuth 2.0 Grant Types
授权类型定义了客户端怎么从资源拥有者获取访问其资源的认证授权。共有4种:授权码授权类型,隐式授权类型,资源拥有者密码凭证授权类型,客户端凭证授权类型。
一、授权码授权类型
(A)客户端通过引导用户的浏览器到授权服务器来发起流程。客户端包含了他的客户端ID,请求范围,本地状态和一个跳转URI,这个URI是授权服务器在用户允许以后,会将用户浏览器跳转到这个URI。
(B)授权服务器认证资源拥有者(通过用户浏览器),并且确定资源拥有者是否允许客户端的访问请求。
(C)如果资源拥有者允许客户端访问,则授权服务器将用户浏览器跳转到第一步指定的URI。这个跳转URI会包含一个授权码,和第一步传过来的客户端状态。
(D)客户端拿着上一步获得的授权码,去跟授权服务器请求一个token。
(E)授权服务器会认证客户端,检验授权码,并确保跳转URI和之前授权服务器跳转的URI匹配。如果一切合法,则授权服务器返回有一个token,可能会带上一个刷新token。
下面是应用场景举例:
场景:XXAPP有个功能是“打印我的百度云照片”,用户张三想使用XXAPP打印其存储在百度云上的照片。
1.张三在XXAPP上点击“打印我的百度云照片”
2.(图步骤A)XXAPP(通过调用浏览器)对百度云授权服务器发起一个请求,附带跳转回XXAPP的URI。
3.百度云授权服务器返回一个“XXAPP要使用其百度云照片的请求询问”,要求张三输入其百度云账号认证身份,并作出是否授权XXAPP访问他在百度云上的资源。
4.(图步骤B)张三输入百度云账号,同意XXAPP的请求,点按钮提交。
5.(图步骤C)百度云授权服务器收到授权询问页面的提交,发现用户允许授权,这时候返回一个跳转(地址是第2步的URI),并附带一个授权码。
6.(图步骤D)XXAPP拿着授权码去访问百度云的授权服务器,并附带第2步的URI。
7.(图步骤E)百度云授权服务器验证XXAPP提交的授权码,如果合法,则返回可以访问资源的token。
8.XXAPP拿着这个token去访问百度的资源服务器,获取图片。
二、隐式授权类型
隐式授权类型获取token多数被用在运行在浏览器中的javascript客户端。javascript客户端通过将用户引导到授权服务器来发起流程,隐式授权类型不需要认证javascript客户端。同时,在用户授权的那一步就获得了token。
注意:授权服务器必须把授权码、token、刷新token和客户端secret key都当成非常机密的数据。他们不应该被放在HTTP协议上传输,授权服务器必须使用TLS协议。这些数据必须安全的保存,可能需要被加密或者哈希签名。
三、资源拥有者密码凭证授权类型
当资源拥有者与客户端拥有可信任的关系时(因为资源拥有者必须把凭证直接给到客户端),适合使用此种模式。授权服务器在启用这种模式的时候,应当特别注意,应该在其他授权模式不可实施的时候才使用此授权方式。
这种授权方式适合客户端能够获取资源拥有者的凭证(用户名和密码,通常使用交互表单)。它也被用来将使用HTTP Basic或者Digest 授权方式的客户端迁移到OAuth,通过将凭证转换成access token。
注意:如果可以的话,应该尽量选择使用授权码授权类型。资源拥有者密码凭证授权类型是为了帮助从HTTP Basic授权和Digest 授权迁移到OAuth2.0而引进的。
四、客户端凭证授权类型
这种授权类型下,客户端就是资源拥有者。
注意:此类型的授权方式必须在机密的客户端使用。
后续会有关于OAuth更多、更深入的学习记录,等我整理后发出来。

发表评论

电子邮件地址不会被公开。 必填项已用*标注