【协议】OAuth2.0

【协议】OAuth2.0 - colin_xun - 博客园

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 @ 2024-06-26 18:54  CharyGao  阅读(9)  评论(0编辑  收藏  举报