OAuth 2.0 是一种授权机制,用于让第三方应用在用户授权的情况下获取系统中该用户的数据,比如现在很多网站都提供通过其他社交账号(QQ、微信、谷歌等等)登录的功能,登录之后网站会获取你的微信名、邮箱之类的信息,这个过程就是通过 OAuth 2.0 实现的

回忆一下平时通过这种方式登录的过程,不难发现 OAuth 2.0 有几个特点:你只需要在社交媒体的网站登录,不需要将账号密码交给你实际登录的第三方应用;第三方应用只能拿到你的部分数据的读权限;通常下次登录都需要重新验证,没有“记住密码”之类的功能

OAuth 授权机制经历过 1.0、1.0a、2.0 三个版本,前两个版本已经用得比较少了,而且 2.0 和它们并不兼容,所以本文的 OAuth 都特指 2.0 版本。

授权码授权类型

用户授权 OAuth service 之后,OAuth service 会发配一个授权码给请求 OAuth 的应用,然后该应用需要请求用户的数据时,可以凭这个授权码和 OAuth service 交换 token, 从下图可以看出 token 对用户是不可见的

隐式授权类型

在隐式授权类型中,token 是通过 browser 端重定向的方式发配给客户端应用的,也就是用户可以拿到 token, 安全性较低

攻击面

OAuth 劫持

redirect_uri 参数未进行校验或可以绕过,通过任意重定向漏洞将 token 发送到攻击者控制的地址

CSRF 绑定劫持

Scope 越权