用于csrf保护的OAuth 2.0状态参数

问题描述

我对授权码授予流程有疑问。 我知道oauth2的第一部分是发送https://auth.server/oauth2/auth?scope= &redirect_uri=https://app.example.com/oauth2/callback &response_type=code&client_id=123 &state=af0ifjsldkj

我对state参数感到困惑。我知道state参数用于防止csrf攻击。但是我应该在哪里保存此参数?如果将其保存到身份验证服务器的会话中,如何在下一步中验证状态?

https://app.example.com/oauth2/callback?
code=MsCeLvIaQm6bTrgtp7&state=af0ifjsldkj

我如何验证app.example.com中的状态参数,但状态参数保存在身份验证服务器的会话中?

解决方法

您的技术堆栈的安全库应为您管理此操作,状态将保存在您的应用程序中:

  • 对于单页应用程序,通常将状态保存到本地存储中
  • 对于服务器端网络应用程序,通常使用仅HTTP临时cookie代替

Auth Server的唯一工作是确保它在对应用程序的响应中返回与从应用程序请求中收到的相同状态。任何现成的Auth Server都会为您做到这一点。

行为在steps 4 and 7 of my blog post中以视觉方式进行了总结。就我而言,我使用的是SPA,而OIDC客户端库负责管理验证响应状态。

结果,我的应用程序受到了CSRF攻击的保护。如果有人将其粘贴到浏览器地址栏中,我的应用将不会尝试处理授权代码: