代码之家  ›  专栏  ›  技术社区  ›  Vitor Py

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

  •  1
  • Vitor Py  · 技术社区  · 15 年前

    我在Appengine上有一个主网站。它在一个子域上,就像 main.example.com网站 . 此主应用程序是我们客户的内容门户。它提供了一个基于yui的Ajax应用程序。客户可以上传数据。用户使用联合登录进行身份验证。

    它上面的Ajax应用程序允许用户处理先前上传的数据。为此,它应该使用在其他子域上运行的WebService,如 service.example.com网站 . WebService有 在Appengine上运行,但在我们的服务上运行——它的CPU很重,并且建立在其他技术的基础上。它需要下载主应用程序上的数据-但是下载服务-就像主应用程序上的所有内容-在认证墙后面。

    我可以通过编程一直允许服务下载它希望下载的内容,但我认为这会变成一个主要的安全问题。

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

    1 回复  |  直到 15 年前
        1
  •  1
  •   Nick Johnson    15 年前

    您不能真正重用身份验证令牌。你应该使用类似于OAuth的东西,但是由于你控制了两端,你可以使它变得更简单:

    1. 生成一个共享秘密,可由main.example.com和service.example.com访问。
    2. 当用户第一次访问service.example.com(没有身份验证cookie)时,是否将其重定向到main.example.com/auth?continue=original_url(其中original_url是他们试图访问的URL)
    3. 当您收到对main.example.com/auth的请求时,首先以常规方式(如果用户尚未登录)记录他们。然后,获取他们的用户ID或其他相关凭证,并生成 HMAC 使用您在步骤1中建立的共享秘密。将用户重定向到service.example.com/finish_auth,传递计算出的hmac、身份验证详细信息(如用户ID)以及传入的任何参数(如continue url)。
    4. 当您收到service.example.com/finish_auth的请求时,如上所述计算HMAC,并检查它是否与传入的HMAC匹配。如果是这样,您就知道请求是合法的。在service.example.com上设置包含任何相关详细信息的身份验证cookie,并将用户重定向回其原始URL。

    这听起来很复杂,但在实现中相当简单。这是在相互信任的系统之间“传递”凭证的标准方法,这与许多SSO系统使用的方式并无不同。