You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多个部署在子域名的Django站点如何实现共享登录认证?

跨子域名Django站点共享登录实现方案

首先说明谷歌这类平台的跨服务自动登录本质是统一身份认证(SSO,单点登录):同根域名下优先通过共享Cookie实现,跨根域名时才会用OAuth2、SAML这类跳转授权协议。你的三个站点都属于example.com根域名,优先用成本最低的同根域共享方案即可。


方案1:同根域Session Cookie共享(优先推荐,改造成本极低)

不需要改动现有业务逻辑,只需要调整几个核心配置即可实现:

  • 统一三个站点的settings.py配置,把Session Cookie的作用域设为根域名:
    所有站点都添加配置SESSION_COOKIE_DOMAIN = ".example.com",开头的点代表所有二级子域名都可以读取该Cookie。
  • 三个站点的SECRET_KEY必须完全一致,Django通过该密钥加密Session和Cookie内容,密钥不同无法解密彼此的Cookie。
  • 统一Session存储:如果之前三个站点的Session默认存在各自的独立数据库,需要把Session存储改成公共的三方存储,比如Redis、Memcached,三个站点都连接同一个存储实例即可。
  • 你之前尝试多数据库路由失败大概率是User模型的路由规则配置不全,参考如下配置即可实现用户数据共享:
    首先在settings.py添加公共认证库配置:
    DATABASES = {
        "default": "当前站点独立业务数据库配置",
        "auth_db": "公共用户认证数据库配置"
    }
    DATABASE_ROUTERS = ["你的项目路径.AuthRouter"]
    
    新增路由类AuthRouter:
    class AuthRouter:
        # 指定需要走公共认证库的应用
        auth_app_labels = {"auth", "sessions", "admin", "contenttypes"}
        
        def db_for_read(self, model, **hints):
            if model._meta.app_label in self.auth_app_labels:
                return "auth_db"
            return "default"
    
        def db_for_write(self, model, **hints):
            if model._meta.app_label in self.auth_app_labels:
                return "auth_db"
            return "default"
    
        def allow_relation(self, obj1, obj2, **hints):
            if obj1._meta.app_label in self.auth_app_labels or obj2._meta.app_label in self.auth_app_labels:
                return True
            return None
    
        def allow_migrate(self, db, app_label, model_name=None, **hints):
            if app_label in self.auth_app_labels:
                return db == "auth_db"
            return db == "default"
    
    配置完成后只需要在auth_db执行一次auth相关的migrate操作,三个站点的用户、Session数据都会统一存在公共库,不会出现跨库读不到用户的问题。
  • 可选配置:如果需要跨站统一CSRF校验,同步添加CSRF_COOKIE_DOMAIN = ".example.com"即可。

方案2:独立SSO认证中心(适合后续扩展跨根域名站点的场景)

如果后续需要接入非example.com的其他站点,可以搭独立统一认证中心:

  • 单独部署一个认证站点,比如sso.example.com,所有用户的注册、登录、授权逻辑都在该站点完成,用户数据只存在该站点的数据库中。
  • 三个业务站点的登录入口都跳转至sso.example.com,用户在认证中心登录完成后,生成授权令牌跳回业务站点,业务站点校验令牌合法后生成自有登录状态即可。
  • Django生态可以直接用django-oauth-toolkit搭建认证中心,业务站点用social-auth-app-django作为OAuth客户端,不需要从零开发授权逻辑。

注意事项

  • 生产环境所有站点必须走HTTPS,开启SESSION_COOKIE_SECURE = True,避免Cookie被劫持。
  • 如果用Redis作为公共Session存储,需要给Redis设置访问密码,做好网络隔离,不要暴露在公网。

内容的提问来源于stack exchange,提问作者Github Copilot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 07:42:00