每用户子域会话的问题& Google OAuth2

时间:2014-03-23 06:40:49

标签: oauth oauth-2.0 google-oauth

我们正在开发一个应用程序,在每个用户帐户的子域下托管每个用户帐户。单独的用户可以通过usera.myapp.com和userb.myapp.com等域访问他们的应用程序。

为了增强应用程序帐户之间的安全性,会话cookie的范围限定为帐户的子域(例如usera.myapp.com而不是.myapp.com)。这似乎对Google的OAuth2实施造成了问题。由于Google OAuth只允许您在其设置中重定向回设置redirect_uri,因此我们无法在授权我们的应用后将用户重定向回其自定义子域。我们被迫将它们重定向回一个通用子域,例如oauth.myapp.com。

一旦重定向,我们就无法再访问会话(会话现在限定为不同的子域)。由于我们无法再访问会话,因此在请求OAuth令牌时,我们无法检查我们设置为“state”参数的CSRF令牌。 OAuth2的大多数其他实现将允许我们重定向回通配符子域,因此这不是问题。

现在我们有两种可能的解决方案来解决这个问题......

  1. 在“state”参数中跳过检查CSRF令牌,这可以让我们了解clikjacking攻击。或...
  2. 打开我们的会话Cookie以使用整个域,而不是将其范围限定到帐户子域。这打开了它自己的蠕虫和安全问题,但这是我们可以处理的事情。
  3. 选项#2似乎是两个邪恶中的较小者,但在我们继续这样做之前,我想要一些输入。

    思想?

1 个答案:

答案 0 :(得分:0)

嗯,是否可以通过散列一堆状态来构造状态值,这样您就不必从cookie中检索所需的值?例如。从您的应用程序中对子域,时间和某些内部系统状态进行哈希处理。然后,您可以重新计算它们在oauth.myapp.com上显示时所期望的值,无需从会话中获取它。应该是有效的反对点击劫持我认为。