Django:是否可以从另一个域名登录用户到子域名?

4
事情是这样的。我有一个Django应用程序为不同的站点提供服务。

site1.myapp.com
site2.myapp.com

用户通过第三方SSO系统登录,然后被重定向(包括验证POST)到 https://myapp.com/auth/

由于我的用户都属于同一个“站点”,我希望myapp.com/auth/将用户登录到相关的站点,例如site1.myapp.com或site2.myapp.com,并将其重定向到该站点...

这是否可能?还是我应该用完全不同的方法解决这个问题? :)

值得一提的是,对于应用程序的通用使用,我有子域中间件以确保用户始终只访问他们的帐户有效的子域(和数据)。

我想使用子域的原因是为了让用户更容易记住他们的帐户URL,同时保持只维护一个django应用程序的优点。

谢谢。希望你能帮忙 :)

顺颂商祺。

pete

2个回答

15

我知道这个问题很久了,但由于谷歌把我带到这里,我会添加这些链接

这个答案涉及(A)跨子域的身份验证和(B)检测正在使用哪个子域以潜在地重定向用户

A.1 如果您想允许所有(通配符)子域名 *.myapp.com,可以通过在settings.py中添加一行来实现:

SESSION_COOKIE_DOMAIN=".myapp.com"

详细信息请参见此处(SO, 2009)此处(SO, 2010)Django文档

Note: login now won't work on localhost, so you have two choices if you need to log in and out on localhost:
1: comment out that line in settings.py, or
2: amend your /etc/hosts file to include the following:

127.0.0.1 localhost
127.0.0.1 dev.myapp.com 

Now you can visit dev.myapp.com in your browser, and it'll actually be talking to 127.0.0.1, not your live website. (Now, across dev.myapp.com, site1.myapp.com, site2.myapp.com and myapp.com, if you log in/out of one, you'll be logged in/out of them all.)

A.2. 如果您想仅允许这两个子域名之间的跨认证,即,他们不会登录到 site3.myapp.com,那么它就变得有点复杂

B. 查看所使用的子域名 在Django中,有一些更加高级的包可以管理子域名,但是您也可以简单地查看 request.META['HTTP_HOST']:

try:
    http_host = request.META['HTTP_HOST']
    # alternative: http_host = request.get_host()
except KeyError:
    http_host = None
    print "Can't find HTTP_HOST"

if http_host and '.myapp.com' in http_host:
    subdomain = http_host.split('.myapp.com')[0]
else:
    subdomain = ''

然后检查您是否满意使用此子域名的request.user。 如果您愿意,可以使用类似HttpResponseRedirect的东西将他们发送到不同的子域名。如果您已经完成了A.1或A.2,那么在应用程序看来,它们是同一个用户(已经登录),在重定向后的新的subdomain.myapp.com中(他们不必再次登录)。
例如:如果用户在ireland.myapp.com上创建了一个帐户,并且您希望始终保持在该站点上,则当他们尝试访问usa.myapp.com时,他们仍将保持登录状态,您可以识别他们并将其发送回ireland.myapp.com(虚构的例子,不是移民的比喻!)

0

1
嗯,那样做并不够。我需要能够将用户登录到他的“自己的应用程序”,但这必须在主域上完成。我不明白网站部分在这里如何帮助我??我更多地考虑会话、重定向、cookie、域名等方面,但这就是我的限度了 :-S - Peter Møller
网站让您根据网站将代码和数据库条目分开。但是,网站可以是您决定的任何内容,包括子域名。因此,如果您将用户链接到“网站”,则创建登录页面,并在登录时获取用户网站并进行重定向。 - Bite code

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