oauth2“状态”参数可以用来避免使用会话cookie来识别用户吗

信息安全 csrf oauth 授权 oauth2
2021-09-11 06:57:22

https://www.rfc-editor.org/rfc/rfc6749#section-4.1.1状态:

4.1.1。授权请求”

“状态”

受到推崇的。客户端用来维护请求和回调之间状态的不透明值。授权服务器在将用户代理重定向回客户端时包含此值。该参数应该用于防止跨站点请求伪造,如第 10.12 节所述。

uuid/v4除了 CSRF 保护之外,在 OAuth2 授权请求中使用我生成的“状态”参数( )来识别授权流程中提供者回调中的用户是否安全?从而使 oauth2 流“无状态”并且不需要负载均衡器的“粘性会话”。

目前,当用户启动 OAuth2 流程(访问登录页面)时,我为他创建了一个唯一的auth-request-idandstate并将其存储在 Redis 中并auth-request-id在 cookie 中发送。

用户在回调请求中登录提供者(Google 或 Facebook)后,我尝试从auth-request-idRedis 中cookie 中查找用户的会话,并验证会话是否存在以及接收到的会话是否state与我发送的会话匹配(针对 CSRF 攻击)。

想知道,我可以跳过创建auth-request-idcookie 并在回调中识别用户state吗?给定逻辑,如果state在 Redis 中找不到匹配项,则假定状态无效,并且所有存储的 Redisstate都有 5 分钟的过期时间。

1个回答

我相信你不能安全地做到这一点。

恶意行为者可以使用您的应用程序自由获取重定向。现在,如果他设法让毫无戒心的受害者打开重定向地址,那么受害者将看到您的应用程序正在请求访问。如果他授予访问权限,他将被重定向回您,如果您仅使用状态来识别他,那么您只需将受害者资源分配给您应用中的恶意参与者帐户。