【问题标题】:(Django) Sharing authentication across two sites that are on different domains(Django) 在不同域上的两个站点之间共享身份验证
【发布时间】:2010-12-07 14:02:58
【问题描述】:

我有两个网站,分别是 foo.com 和 bar.com,它们都是基于 Django 的。主要注册发生在 foo.com 上(我希望主用户 db 在这里),我希望发生三件事:

1) 登录 foo.com 的用户无需再次登录即可自动访问 bar.com

2) 直接登录 bar.com 的用户是针对 foo.com 用户 db 进行身份验证的。

3) 用户无需直接在 bar.com 注册。

我怎样才能做到这一点?如果它大大简化了事情,我可以让 bar.com 成为 foo.com 的子域(例如 bar.foo.com),但它们必须是单独的站点。

【问题讨论】:

    标签: django django-authentication


    【解决方案1】:

    这取决于您的要求。如果可以,简单的解决方案是简单地将两个站点托管在一个 Django 实例上。换句话说,您的 Django 项目同时托管这两个站点,但您有一个 url rewrite rulefoo.com 映射到 http://localhost/foo/bar.comhttp://localhost/bar/。在这种情况下,Django 的身份验证系统将“正常工作”。重写规则当然也可以应用于子域;我已经使用这种技术构建了一个托管数百个子域的系统。

    如果这不是一个选项,在您的 Django 实例之间共享数据库并设置 SESSION_COOKIE_DOMAIN,正如其他人所提到的,应该可以工作。

    【讨论】:

    • 嗯,为什么投反对票?这是处理共享相同数据的子域或域的一种非常自然的方式。
    • 您的潜在解决方案当然不值得投反对票。
    • 不知道为什么这会被否决,但这看起来是一个很好的问题答案,似乎正是我所需要的。希望这适用于 django 项目前面的 nginx...
    【解决方案2】:

    您的第三个要求可以通过在两个站点之间共享相同的数据库轻松解决(因此具有相同的用户表。

    由于跨域问题,第一个要求很棘手(不会共享会话 cookie)。

    您真正需要的是Single Sign On (SSO)。你可以考虑django-openid

    【讨论】:

    • #2 可以通过多种方式完成:直接访问其他数据库,或使用服务器服务器聊天。正如约翰所说,#1 是主要问题。
    【解决方案3】:

    我有一个非常相似的问题,但 OpenID 对我来说不是一个可行的解决方案。随着 django >1.2 中多个数据库的出现,现在可以很容易地跨站点共享会话和登录数据。 This blog post 很好地解释了如何设置它。希望其他人发现这和我一样有用。

    【讨论】:

      【解决方案4】:

      我认为您正在寻找的是SESSION_COOKIE_DOMAIN 设置。你可以这样设置:

      SESSION_COOKIE_DOMAIN = 'foo.com'
      

      有关更多信息,请参阅http://docs.djangoproject.com/en/dev/topics/http/sessions/#session-cookie-domain。这确实假设两个应用程序都使用相同的会话存储后端。

      【讨论】:

        猜你喜欢
        • 2011-10-10
        • 2010-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-27
        • 1970-01-01
        • 2021-11-19
        相关资源
        最近更新 更多