如何管理 `state` nonce auth0 授权码授权流程?

How to manage `state` nonce auth0 authorization code grant flow?

我的应用程序由客户端 html/javascript、Web 服务器和 API("regular web app",如 auth0 所称)组成。在 Auth0 的 Authorization Code Grant 文档页面上,它说要像这样创建一个 URL:

https://ygctest.auth0.com/authorize?
    audience=YOUR_API_AUDIENCE&
    scope=YOUR_SCOPE&
    response_type=code&
    client_id=YOUR_CLIENT_ID&
    redirect_uri=https://YOUR_APP/callback&
    state=YOUR_OPAQUE_VALUE

文档说从 auth0 服务器通过查询参数返回到 /callback 的状态(显然是防止 CSRF 的随机数)需要与最初生成的状态进行比较。

我的问题是:"state"变量应该在哪里生成?而且,是否需要在客户端、服务器或两者上验证状态变量?

我应该在服务器上生成它并以某种方式传递给客户端吗?如果是这样,最好将它作为 cookie 来做,还是我可以生成整个 URL 服务器端并将其粘贴在 html 中?

如果状态变量应该在客户端生成,服务器应该如何知道客户端认为的状态是什么?浏览器从登录页面重定向到 /callback(在示例中),因此客户端没有机会检查状态。客户端是否应该设置一个 cookie,以便 GET/callback 包含状态?

在服务器端创建会话状态,将其值存储在会话中(加密的cookie或服务器端存储缓存(例如Redis)。然后在代码授权授予流程中,首先检查其值在你的回调中。一些库可能会为你处理检查,否则你将不得不进行仪式,将状态值显式地从代码中的会话存储中拉出,并将其与返回给你的状态值显式地进行比较回调端点。

如果您正在使用 Auth0 托管登录页面,并调用 authorize 端点,那么您可以在服务器端完成所有操作 - 请参阅 here。如果您需要在 UI 上呈现具有状态值的表单,那么您的控制器可以将您的状态值作为插值值传递给视图层。关键要点是建议在服务器端生成值,将其存储在安全会话存储中,并在服务器端(在回调中)为代码授权授权流(常规 Web 应用程序)进行比较。