🌝

OAuth2.0 中的 state 参数

Posted at — Aug 05, 2021

最初看到 OAuth2.0 中的 state 参数的时候有点懵,不太清楚这参数是干啥的,然后又仔细读了几遍相关 RFC 后才明白,最后用这篇文章当个记录。PS:RFC 真是个好东西!

OAuth2.0 协议用于用户授权第三方应用,使之能访问受保护的用户资源。RFC67491 中规定了 OAuth2.0 的 4 种授权方式,分别是:

且整个协议过程由 4 个部分组成,分别是:

前两种授权方式需要客户端在访问授权服务器的 authorize 接口时带上一个 state 参数,用来防御跨站请求伪造(CSRF)攻击。

以授权码方式为例,该方式要求客户端提供一个回调地址(redirection uri)用来接受来自授权服务器带有授权码(code)的重定向请求。即该回调地址是对外开放的,客户端为了确定该重定向的确来自授权服务器,而不是其他由攻击者伪造的请求,就在获取授权码阶段,将一个 state 字段通过 url 查询参数(querystring)告诉给授权服务器,授权服务器在重定向时原封不动的也通过 url 查询参数返回该 state 给客户端,然后客户端通过校验 state 是否正确来判断该重定向请求是否来自刚刚请求的授权服务器,从而达到对 CSRF 的防御。

所以,state 参数的生成和校验需要由客户端妥善处理,且参数值要让攻击者难以在有限时间内试出。在完成一次授权过程后,需要立即销毁该 state 参数,保证每次使用不同的参数值。


  1. https://www.rfc-editor.org/rfc/rfc6749.html ↩︎