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

如何阻止子域名间Cookie共享?Django+Firebase动态配置方案

阻止Cookie在子域名间共享并实现动态域绑定(Django + Firebase)

核心逻辑

要实现子域名Cookie完全隔离,核心就是放弃通配符Cookie域配置,给每个请求的精确子域名单独绑定Cookie的domain属性——这样Cookie只会被当前访问的子域名读取,不会扩散到其他同后缀子域名。

步骤1:移除全局通配符Cookie设置

先把settings.py里的DJANGO_COOKIE_DOMAIN = '.dev.fox.com'删掉或注释掉,全局通配符是跨子域名共享的根源。

步骤2:Django端动态设置Cookie Domain

在登录视图里,从请求对象中获取当前访问的精确域名,把它作为Cookie的domain参数传入,实现动态绑定。

示例代码:

from django.http import HttpResponse
from firebase_admin import auth

def login_view(request):
    # 处理Firebase认证逻辑,获取id_token
    id_token = request.POST.get('id_token')
    decoded_token = auth.verify_id_token(id_token)
    uid = decoded_token['uid']

    # 获取当前请求的精确域名(如app.dev.fox.com)
    current_domain = request.get_host()

    # 设置会话Cookie,绑定到当前精确域名
    response = HttpResponse("登录成功")
    response.set_cookie(
        'session_token',
        value=id_token,
        domain=current_domain,
        httponly=True,
        secure=True,  # 生产环境强制开启
        samesite='Lax'
    )
    return response

这样用户在app.dev.fox.com登录时,Cookie的domain就是app.dev.fox.com;在abc.dev.fox.com登录时,domain自动切换为abc.dev.fox.com,天然实现子域名隔离。

步骤3:处理Firebase自动生成的认证Cookie

如果Firebase SDK自动帮你设置认证Cookie,需要在前端初始化时指定动态域名,避免Firebase用通配符设置Cookie:

import { initializeApp } from "firebase/app";
import { getAuth, setPersistence, browserCookiePersistence } from "firebase/auth";

const firebaseConfig = {
  // 你的Firebase配置信息
};

const app = initializeApp(firebaseConfig);
const auth = getAuth(app);

// 配置Firebase认证Cookie绑定到当前域名
setPersistence(auth, browserCookiePersistence({
  cookieDomain: window.location.hostname
}));

额外注意点

  • 开发环境用localhost测试时,直接把domain设为localhost即可,不要加通配符,否则浏览器可能不识别。
  • 生产环境必须开启secure=True,且域名必须是HTTPS协议,否则浏览器会拒绝设置Cookie。
  • SameSite建议设为Lax或Strict,既防CSRF攻击,又能避免跨域场景下的Cookie丢失。

内容的提问来源于stack exchange,提问作者MR WHO

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 15:56:14