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

15

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

1)在foo.com登录的用户可以自动访问bar.com而无需重新登录

2)直接在bar.com登录的用户被验证为foo.com用户数据库中的用户。

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

如何实现这一点?如果大大简化了操作,我可以将bar.com设置为foo.com的子域名(例如bar.foo.com),但它们必须是不同的网站。

5个回答

7
这取决于您的要求。如果可以的话,简单的解决方案是在一个Django实例上托管两个站点。换句话说,您的Django项目托管两个站点,但您有一个URL rewrite rulefoo.com映射到http://localhost/foo/bar.com映射到http://localhost/bar/。在这种情况下,Django的auth系统将“只需工作”。重写规则当然也适用于子域;我使用此技术构建了一个托管数百个子域的系统。
如果这不是一个选项,则在您的Django实例之间共享数据库并设置SESSION_COOKIE_DOMAIN应该可以正常工作,如其他人所提到的。

为什么要给我点踩呢?这是一种完全自然的处理子域名或共享相同数据的域名的方式。 - Daniel Naab
你的潜在解决方案绝对不应该被点踩。 - Robert Roland
不知道为什么会被投票否决,但这看起来是一个相当好的回答问题,并且似乎正是我所需要的。希望这可以在 Django 项目前面使用 nginx。 - paperreduction

6
你的第三个需求可以通过两个网站共享同一个数据库来轻松解决(因此拥有相同的用户表)。
由于跨域问题,第一个需求比较棘手(会话cookie不会被共享)。
你真正需要的是单点登录(SSO)。你可以考虑使用django-openid

2
#2 可以通过直接访问另一个数据库或使用服务器 <=> 服务器聊天来完成。正如 John 所说,#1 是主要问题。 - Peter Rowell

5

我有一个非常类似的问题,但OpenID对我来说不是可行的解决方案。随着Django 1.2以上版本中引入了多个数据库,现在很容易在不同的站点之间共享会话和登录数据。这篇博客文章很好地解释了如何设置它。希望其他人也能像我一样发现它有用。


0

0

这些可以通过实现CAS(集中身份验证服务)来实现。

在您的示例中,foo.com是您的服务器,bar.com是客户端。只需要一个服务器;您可以拥有尽可能多的客户端。

在您的服务器上:

  • 安装和配置django-mama-cas(或任何等效物)和django-cas-ng(或任何等效物)。
  • 不需要在服务器上添加django-cas-ng URL。

在您的客户端上:

  • 安装并配置django-cas-ng(或任何等效的程序)。
  • 在客户端的urls.py中添加登录和注销django-cas-ng网址。
  • 对于我来说,我已经在受保护的视图中添加了装饰器@login_required(login_url =“/accounts/login”)
  • 确保在客户端的settings.py中定义CAS_SERVER_URL。在您的示例中,类似于“CAS_SERVER_URL = foo.com”。

希望这可以帮助到其他人,因为我没有找到任何明确给出并解释上述指令的教程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接