多个部署在子域名的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
相关产品推荐
相关产品推荐

