理解oauth2 以及为什么 使用refresh_token
https://blog.csdn.net/seccloud/article/details/8192707
4. OAuth设计上的安全性考虑
4.1 为何引入authorization_code?
协议设计中,为什么要使用authorization_code来交换access_token?这是读者容易想到的一个问题。也就是说,在协议的第3步,为什么不直接将access_token通过重定向方式返回给Client呢?比如:
HTTP/1.1 302
Location:
https://www.facebook.com/?access_token=ya29.AHES6ZSXVKYTW2VAGZtnMjD&token_type=Bearer&expires_in=3600
如果直接返回access_token,协议将变得更加简洁,而且少一次Client与AS之间的交互,性能也更优。那为何不这么设计呢?协议文档[1]中并没有给出这样设计的理由,但也不难分析:
(1) 浏览器的redirect_uri是一个不安全信道,此方式不适合于传递敏感数据(如access_token)。因为uri可能通过HTTP referrer被传递给其它恶意站点,也可能存在于浏览器cacher或log文件中,这就给攻击者盗取access_token带来了很多机会。另外,此协议也不应该假设RO用户代理的行为是可信赖的,因为RO的浏览器可能早已被攻击者植入了跨站脚本用来监听access_token。因此,access_token通过RO的用户代理传递给Client,会显著扩大access_token被泄露的风险。 但authorization_code可以通过redirect_uri方式来传递,是因为authorization_code并不像access_token一样敏感。即使authorization_code被泄露,攻击者也无法直接拿到access_token,因为拿authorization_code去交换access_token是需要验证Client的真实身份。也就是说,除了Client之外,其他人拿authorization_code是没有用的。 此外,access_token应该只颁发给Client使用,其他任何主体(包括RO)都不应该获取access_token。协议的设计应能保证Client是唯一有能力获取access_token的主体。引入authorization_code之后,便可以保证Client是access_token的唯一持有人。当然,Client也是唯一的有义务需要保护access_token不被泄露。
(2) 引入authorization_code还会带来如下的好处。由于协议需要验证Client的身份,如果不引入authorization_code,这个Client的身份认证只能通过第1步的redirect_uri来传递。同样由于redirect_uri是一个不安全信道,这就额外要求Client必须使用数字签名技术来进行身份认证,而不能用简单的密码或口令认证方式。引入authorization_code之后,AS可以直接对Client进行身份认证(见步骤4和5),而且可以支持任意的Client认证方式(比如,简单地直接将Client端密钥发送给AS)。
在我们理解了上述安全性考虑之后,读者也许会有豁然开朗的感觉,懂得了引入authorization_code的妙处。那么,是不是一定要引入authorization_code才能解决这些安全问题呢?当然不是。笔者将会在另一篇博文给出一个直接返回access_token的扩展授权类型解决方案,它在满足相同安全性的条件下,使协议更简洁,交互次数更少。
https://blog.csdn.net/qq_39403734/article/details/79141429
access_token与refresh_token之为什么要用refresh_token刷新不重新获取access_token?
作为一个小白,在做微信第三方登录的时候遇到的一些问题总结了一下:
问题:access_token与refresh_token之为什么要用refresh_token刷新不重新获取access_token?
网上挺多回答的,但是我都觉得不是很满意,所以我就自己总结了一下;
原因是access_token只保存2个小时,而refresh_token保存30天;
当access_token在登录2个小时后过期了,难道就要用户在重新登录吗?
当然不可能,这个时候refresh_token就有用武之地了;
那又有同学问了,那我直接重新访问
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
不就能获取access_token了吗?为什么要用refresh_token刷新?
那么重点就来了,上面的访问路径需要参数code,而code是一次性的参数,就是用一次之后就没用了的,需要重新获取,而重新获取就需要用户再一次扫码或者账号登录才能获取code,所以到这里应该就能明白为什么要用refresh_token刷新而不是重新用code来获取access_token了;
说道这有些不细心的同学就要问了,怎么用refresh_token进行刷新,其实官网上是有的,但是我还是在这里简单的讲述一下吧;
请求一下链接进行refresh_token刷新:
https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
必要的参数说明:
appid:唯一的标识
grant_type:填refresh_token(就这几个英文字母,就是这个类型)
refresh_token:填写code获取access_token时获取到的refresh_token;
有不理解的可以在评论与我讨论;
Tags : 本文未设置标签
您可以自由的转载和修改,但请务必注明文章来源并且不可用于商业目的。
本站大部分内容收集于互联网,如果有侵权内容、不妥之处,请联系删除。敬请谅解!