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

时间:2018-01-27 12:57:42

标签: oauth oauth-2.0 auth0

我的应用程序包括客户端html / javascript,Web服务器和API("常规Web应用程序",auth0调用它)。在Auth0上的Authorization Code Grant doc页面上,它说要创建一个这样的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的随机数)需要与最初生成的状态进行比较。

我的问题是:"状态"变量生成?并且,状态变量是否需要在客户端,服务器或两者上进行验证?

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

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

1 个答案:

答案 0 :(得分:1)

在服务器端创建会话状态,将其值存储在会话中(加密的cookie或服务器端存储缓存(例如Redis)。)然后在代码授权授权流程中,将其值作为您的第一个操作检查有些库可能会为您处理检查,否则您将不得不在代码中明确地从会话存储中提取状态值,并将其明确地与返回到回调端点的状态值进行比较。

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