(Django)在不同域上的两个站点之间共享身份验证

时间:2009-10-17 06:48:11

标签: django django-authentication

我有两个网站说foo.com和bar.com都是基于Django的。主要注册发生在foo.com上(我希望主要用户数据库在这里),我希望有三件事情发生:

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

2)直接登录bar.com的用户将通过foo.com用户db。

进行身份验证

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

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

4 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:4)

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

答案 3 :(得分:0)

我认为你要找的是SESSION_COOKIE_DOMAIN设置。你可以这样设置:

SESSION_COOKIE_DOMAIN = 'foo.com'

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