我试图了解 state 如何通过防止 CSRF 来使 Oauth 流程受益。我只是不明白客户端服务器将 URL 中的状态与什么进行比较。我见过这样的例子:
爱丽丝,good.com - 好。马洛里,bad.com - 糟糕。 google.com - 身份验证服务器。 Alice 已通过 google.com 在 good.com 获得授权
auth code
和 state
good.com/complete-auth?code=abc&state=xyz
那么
good.com
究竟如何验证state=xyz
不属于Alice的浏览器呢?据我了解,为了使其正常工作,后端必须在整个过程开始之前以某种方式安全地向 Alice 的浏览器提供任何类型的 ID。因此,当调用 complete-auth
时,ID 也会被传输。但看起来只能通过 cookie 来实现。这是服务器在重定向期间告诉浏览器保存某些内容的唯一方法。我简直不敢相信。移动应用程序如何处理这个问题?
我找到了真正的原因。为了使整个 OAuth 流程正确发生,公共客户端必须是 OAuth 流程链中的第一个参与者。换句话说,它必须启动流程,而不是后端。通过这样做,客户端会在其一侧生成一个状态,并在需要时存储它(对于 angular-oauth2-oidc 来说,它是本地存储)。