AppEngine和非AppEngine子域上的OpenID身份验证

时间:2010-07-19 01:05:31

标签: security web-services google-app-engine openid

我在AppEngine上运行了一个主网站。它位于 main.example.com 等子域中。该主要应用程序是我们客户的内容门户。它提供了一个基于YUI构建的Ajax应用程序。客户可以将数据上传到它。用户使用联合登录进行身份验证。

上面的Ajax应用程序允许用户处理先前上传的数据。要做到这一点,它应该使用在 service.example.com 等其他子域上运行的Web服务。 Web服务在AppEngine上运行,但在我们的服务上运行 - 它的CPU很重,并且基于其他技术构建。它需要在主应用程序上下载数据 - 但下载服务 - 就像主应用程序上的所有内容一样 - 都在身份验证墙后面。

我可以以编程方式始终允许服务下载wharever,但我认为这可能会成为一个主要的安全问题。

如何重用OpenID身份验证“令牌”以允许它(服务)作为经过身份验证的用户在主应用程序中显示,以便它可以下载数据?或者如果我能做到这一点,那么完成我打算做的最好的方法是什么?

1 个答案:

答案 0 :(得分:1)

您无法真正重复使用身份验证令牌。您应该使用的是类似于OAuth的东西,但是既然您控制了两端,您可以使它更简单:

  1. 生成可由main.example.com和service.example.com
  2. 访问的共享密钥
  3. 当用户首次访问service.example.com(无身份验证Cookie)时,请将其重定向到main.example.com/auth?continue=original_url(其中original_url是他们尝试访问的网址)
  4. 当您收到对main.example.com/auth的请求时,请先以常规方式记录用户(如果尚未注册)。然后,使用他们的用户ID或其他相关凭据,并使用您在步骤1中建立的共享密钥从他们生成HMAC。将用户重定向到service.example.com/finish_auth,传递计算的HMAC,身份验证详细信息,例如用户ID,以及您传递的任何参数,例如continue URL。
  5. 当您收到service.example.com/finish_auth的请求时,请按上述方式计算HMAC,并检查它是否与传入的HMAC匹配。如果是,您知道该请求是合法的。在service.example.com上设置包含任何相关详细信息的身份验证cookie,并将用户重定向回其原始URL。
  6. 这听起来很复杂,但实施起来相当简单。这是在相互信任的系统之间“传递”凭证的标准方法,它与许多SSO系统使用的方式不同。