OAuth2.0 协议用于用户授权第三方应用,使之能访问受保护的用户资源。RFC67491 中规定了 OAuth2.0 的 4 种授权方式,分别是:
- 授权码式(authorization code)
- 隐含式(implicit)
- 密码式(resource owner password credentials)
- 客户端模式(client credentials)
且整个协议过程由 4 个部分组成,分别是:
- 客户端(client)
- 资源拥有者(resource owner)
- 授权服务器(authorization server)
- 资源服务器(resource server)
前两种授权方式需要客户端在访问授权服务器的 authorize 接口时带上一个 state 参数,用来防御跨站请求伪造(CSRF)攻击。
以授权码方式为例,该方式要求客户端提供一个回调地址(redirection uri)用来接受来自授权服务器带有授权码(code)的重定向请求。即该回调地址是对外开放的,客户端为了确定该重定向的确来自授权服务器,而不是其他由攻击者伪造的请求,就在获取授权码阶段,将一个 state 字段通过 url 查询参数(querystring)告诉给授权服务器,授权服务器在重定向时原封不动的也通过 url 查询参数返回该 state 给客户端,然后客户端通过校验 state 是否正确来判断该重定向请求是否来自刚刚请求的授权服务器,从而达到对 CSRF 的防御。
所以,state 参数的生成和校验需要由客户端妥善处理,且参数值要让攻击者难以在有限时间内试出。在完成一次授权过程后,需要立即销毁该 state 参数,保证每次使用不同的参数值。