【协议】OAuth2.0

OAuth已经经历了三个版本,分别是OAuth1.0,OAuth1.0A,OAuth2.0三个版本,目前市面用的最多资料最多的还是2.0,OAuth是一种授权协议,下面的所有文字都是从这一句话展开的,大家请记住。

认证、授权、鉴权区别

在理解为什么OAuth是一种授权协议的情况下,我们先来明确一下,什么是认证、授权、鉴权,以及他们的区别,职责。

认证

认证是根据声明者所提供的识别信息,确认声明者的身份。对应的英文是identification或者网上经常看到的是authentication这里是个名词,其实认证应该是一个过程
我们常见的认证方式有

  • 用户名密码
  • 二维码
  • 短信
  • 身份证号
  • 生物特征识别
  • 以上组合认证,以及其他方式
    如果以公司门禁为例,那么对应的就是识别指纹的过程

授权

授权是资源所有者赋予资源执行者操作指定范围资源的操作权限。对应的英文单词authorization
里面总共出现了四个角色:资源所有者,资源执行者,资源,操作权限
在工程中这里的四个角色可以在不同机器上也可以在一台机器上
如果以公司门禁为例,那么你入职公司的时候录入指纹的时候就是在给你授权。这里授权的载体就是指纹
那在工程中,可以用session,cookie,token作为权限的载体。cookie和session是在浏览器交互中,而token可以在任何客户端都可以实现交互。

鉴权

鉴权是指对声明者所拥有的权利进行校验。英文单词是authentication鉴权的输出是权限,下游是权限控制
如果以公司门禁为例,那么鉴权的过程就是你把手放上门禁,然后门禁进行验证的过程,验证后输出你拥有的权限,然后里面的硬件,也就是权限控制器打开锁。

为什么要有OAuth

了解了认证、授权、鉴权的区别,那么OAuth是做什么的呢?在官方文档的开头看到这么一段话

Abstract

The OAuth 2.0 authorization framework enables a third-party
application to obtain limited access to an HTTP service, either on
behalf of a resource owner by orchestrating an approval interaction
between the resource owner and the HTTP service, or by allowing the
third-party application to obtain access on its own behalf. This
specification replaces and obsoletes the OAuth 1.0 protocol described

简单理解就是提供一种方式,在资源所有者允许的情况下,第三方应用程序可以代表资源所有者来有限的访问权限。
这里即便允许第三方访问了,依然是有限的,有可能只是一些获取用户信息等,用于第三方登录

另一方面,为什么要有OAuth呢?
假设一种情况,以s3文件服务器为例,现在文件服务器叫A,A现在要做到每个用户只能下载自己上传自己的文件。如果B要接入A,那B是不是要知道你在A上的用户名和密码。不然A怎么判断B的角色。所以OAuth主要做的就是让A给B授权更加安全

几个问题

  • 为什么要先获取code才能获取token?

首先,假设没有code这一步,直接获取token,那么token就在浏览器和授权服务器之间透明传输了,透明传输对于非https是不安全的,可能出现中间攻击,但是如果用了https的话,其实这一步也就可以了,因为这个时候数据加密了。即便中间人拦截了也无法获取数据。那他即便拿到了资源也无用。

但是OAuth2.0设计之初的目标之一是让不支持Https的网站也能安全使用。secret的作用是为了校验client的身份的,但是要记住secret是在网络中传输的,所以很有可能被截获,那么OAuth如何解决这个问题呢?它要求code只能使用一次,一般情况下我们获取code以后都会接着获取token,如果攻击者把code和secret都截获了,即便他获取了token,但因为我们接下来也会用到code,所以他之前获取的token就会失效。也有可能他给你返回一个错误的code,但无论如何你登录了就可以认为其他人没有登录,一旦不能登录,要及时更换自己的secret。

  • state的作用是什么?

我们假设state为空,现在用户登录了一个危险的网站而且没有退出,这时候如果用户在安全网站上进行第三方登录,那么用户登录以后回调的时候,回调地址被拦截,然后伪装一个地址返回给用户,用户点击登录,这个时候登录的其实是攻击者的账户。这个时候如果用户可能上传一些敏感数据到危险账户上。

如果有了state的话,那么第一步发起请求是会有一个state,即便被拦截了,攻击者的账户的state和你的state也不一样,这个时候就会验证失败。

  • scope的作用是什么?

scope其实就是访问权限列表

认证协议

从上面可以看到OAuth只是确保授权过程中的安全性问题,那么认证过程呢?如何保证知道了用户名密码的就一定是用户本人呢?如何保证指纹一定是用户自己的呢?

认证协议是由认证双方执行的一系列步骤,设计两个实体,示证者P和验证者V,P要让V相信“他就是P”,安全的认证协议必须满足一下条件

  1. P能向V成功证明自己就是P
  2. V不能用于P认证期间的信息伪装成P(即无法对第三方证明他即为P)
  3. 除P外的第三者W用P的身份进行该协议,可让V信任他是P的概率可不计

可以看看OpenID,OIDC是基于OAuth2+OpenID整合的新的认证授权协议。

参考

posted @ 2020-08-05 14:52  colin_xun  阅读(170)  评论(0编辑  收藏  举报