时长15:27大小14.17M
作者回复: 一方面授权码也都有有效期,另外一方面除非再盗取了第三方应用软件的app_id、secret才能成功请求资源。
作者回复: refresh_token 存在于授权码许可和资源拥有者凭据许可下
,为了不烦最终用户频繁的点击【授权】按钮动作,才有了这样的机制;
在 隐式许可和客户端凭据许可,这两种许可类型下,不需要refresh_token,他们可以直接根据app_id和secret来换取访问令牌,因为,1-隐式许可对任何内容都是“透明的”,也没有必要存在refresh_token,2-客户端凭据许可,既然是叫做“客户端凭据”了,在获取那些没有跟用户强关联的信息的时候,比如 国家省市信息类似的信息,其实没有用户参与的必要性,当然可以随时获取令牌。
作者回复: 在后面的安全那讲中,我们也会强调这点,令牌一定要通过后端通信传输(其实也有授权许可是通过前端传输,比如隐式许可,但它是非常不安全的许可类型),我们强调OAuth 2.0的核心是令牌,不过,安全性是一个【组合性】的问题,单个信息暴露在公网一时是没有直接的问题,比如用户的手机号,被人知道了,一般情况下仅仅是被骚扰,但如果黑产拿到跟这个手机号更多关联的信息,比如订单信息,你买了什么商品都知道,这个时候用户就会有被恶意诈骗的可能。像这样的核心信息手机号也好,token也好肯定都是要重点保护的。
作者回复: HTTPS 和 OAuth 是两个维度的安全,HTTPS解决的信息加密传输,OAuth 解决的是用token来代替用户名和密码传输。
作者回复: OAuth 2.0 产生于第三方应用的场景,来管理对外的权限,但是它的本质思想是【用token来代替用户名和密码】。
对于我们内部的系统服务之间,我们可以借用OAuth 2.0的这种思想来满足我们的生产环境,比如微服务之间调用需要进行鉴权的时候,我们就可以使用这种token的机制。
作者回复: 感谢 马成 同学的细心学习。
OAuth 2.0 流程许可类型中有最基本的四种授权许可类型,授权码许可、客户端凭据许可、隐式许可、资源拥有者凭据许可,你举得那个例子,可以属于客户端凭据许可类型场景,不需要授权码。咱们这篇文章讲的授权码许可类型,所以谈到了授权码许可类型为什么要有授权码,为什么这么啰嗦再来一个步骤,而不是直接给访问令牌,直接给访问令牌的授权许可类型比如刚才说的客户端凭据许可类型。
1)【是为了增加一次用户可选择的交互】,这里呢,咱们文中也描述了“为了重新建立起这样的一次连接,我们又不能让访问令牌暴露出去,就有了这样一个临时的、间接的凭证:授权码。因为小兔软件最终要拿到的是安全保密性要求极高的访问令牌,并不是授权码,而授权码是可以暴露在浏览器上面的。这样有了授权码的参与,访问令牌可以在后端服务之间传输,同时呢【还可以重新建立小明与小兔软件之间的“连接”】。这样通过一个授权码,既“照顾”到了小明的体验,又“照顾”了通信的安全。”
2)安全性考虑访问令牌一定是要有有效期的,另外呢,重新获取令牌跟刷新令牌有关系,跟授权码就没有关系了。
3)授权只有一个阶段就是【颁发访问令牌】,其余的内容都是做准备工作。授权的本质并不是建设appkey传输的次数,而是为了【减少用户名和密码的传输次数】,以便减少“攻击面”,不用每次访问订单API、商品API等等,都带着用户名和密码。
作者回复: 如果是按照直接把访问令牌给的小兔的后端,就会有这样的情况:小明访问小兔,小兔重定向到了授权服务页面,这个时候小明一种【停留】在了授权服务的页面上。
小明被重定向到授权服务之后,小明跟小兔之间的”连接断了“,也是这个意思。
作者回复: Web场景下,授权码code的值是在前端通信中完成的,也就是通信载体是 浏览器,再进一步说是通过重定向完成的,所以要返回到浏览器上,第三方软件-小兔软件,它通过这样的方式拿到了授权码code的值。
作者回复: “有能力截取到code同样也有能力获取app_id和secret”,获取app_id和secret的难度是很大的,这些都是保存在第三方应用的服务器上面。
作者回复: 以小兔打单软件为例,资源拥有者->在京东商城开店的商家,客户端->小兔打单软件,授权服务->开放平台的授权服务,受保护资源->开放平台的API(实际是商家的店铺产生的数据,但是以API的形式开放出去的)。你说的后两个关系是对的。
作者回复: 1、若access_token已超时,那么进行refresh_token会获取一个新的access_token,新的超时时间;
2、若access_token未超时,那么进行refresh_token有两种结果方式:(1)会改变access_token,但超时时间会刷新,相当于续期access_token,有的开放平台是这么做的(2)更新access_token的值,我们建议【统一更新access_token的值】。
3、refresh_token拥有较长的有效期,当refresh_token失效后,需要用户重新授权。
课程中也有提到,有了refresh_token的参与,提升了用户的体验。
作者回复: access_token的有效期在授权服务侧管理,也就是平台一侧,其实也谈不上管理,实际是一个时间戳,每次访问会判断时间间隔。如果想【提前】发现access_token的有效期是否到期则需要第三方软件额外的去处理,比如定时检查。
refresh_token的作用就是在access_token到期的时候,不需要用户的参与的情况下,重新获得访问令牌的值。
只会更新access_token值,不会更新access_token的过去时间。
作者回复: 我们常说的token和access_token, 实指一个东西,就是access_token。
传输一定要在HTTPS中进行。
第三方应用添加IP白名单也是一个安全防护的措施,开放平台也会这么做。
作者回复: 需要换取用户信息。
生成access_token的时候的粒度一般是app_id+用户,这样access_token和app_id+用户有个对应关系,数据服务这一层他们是不知道token的,需要解析出用户,才能调用数据的API。
一般如果有API GATEWAY 这一层的话,这个工作是在API GATEWAY来处理的,如果没有就是在受保护资源服务这层来处理。
作者回复: 第三方移动App也可以采用授权码许可流程,通过code换取access_token,然后通过access_token换取数据。
作者回复: app_secret的安全性会比较高,这个信息是在第三方软件来平台注册的时候,平台为其分配的。
作者回复: 放在第三方软件的后台存储管理
作者回复: 是的