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

如何在Django项目中实现登录时向cookies及localStorage存储加密用户信息

Django 登录模块存localStorage与加密Cookie实现方案

核心改造步骤

1. 加密Token生成工具

我们直接用Django内置的django.core.signing模块做内容加密,无需引入第三方依赖,加密内容包含用户唯一ID、姓名、邮箱三个核心字段,避免敏感信息明文泄露:

# 可写在account/utils.py中
from django.conf import settings
from django.core import signing
from .models import CustomUser

def generate_user_token(user, expire_days=7):
    """生成加密的用户信息Token"""
    return signing.dumps(
        {
            "user_id": user.id,
            "username": user.username,
            "email": user.email
        },
        salt="login_auth_token",
        key=settings.SECRET_KEY
    )

def verify_user_token(token, expire_days=7):
    """校验Token合法性,返回对应用户或None"""
    try:
        data = signing.loads(
            token,
            salt="login_auth_token",
            key=settings.SECRET_KEY,
            max_age=expire_days * 86400
        )
        return CustomUser.objects.filter(id=data["user_id"], is_active=True).first()
    except (signing.BadSignature, signing.SignatureExpired, CustomUser.DoesNotExist):
        return None

2. 修改登录视图加Cookie设置

你现有的员工登录视图c_login、以及对应的终端用户登录视图u_login都要做相同改造,登录成功后生成加密Token写入Cookie:

# 改造后的员工登录视图
from .utils import generate_user_token

def c_login(request):
    print("runned")
    if request.method == 'POST':
        form = LoginForm(request.POST)
        if form.is_valid():
            cd = form.cleaned_data
            print("cd",cd)
            user = authenticate(request,
                               username=cd['username'],
                                password=cd['password'],
                                remember_me=cd['remember_me'])
            if user is not None:
                if user.is_active:
                    login(request, user)
                    # 生成响应对象
                    response = HttpResponseRedirect(reverse('feed:user_feed', args=[request.user.profile.slug]))
                    # 生成加密Token
                    auth_token = generate_user_token(user)
                    # 设置Cookie
                    response.set_cookie(
                        "auth_token",
                        auth_token,
                        # 勾选记住我则存7天,否则为会话级Cookie,关闭浏览器就失效
                        max_age=7*86400 if cd["remember_me"] else None,
                        secure=request.is_secure(), # HTTPS环境下自动开启,避免明文传输
                        httponly=False, # 必须设为False,允许前端JS读取后写入localStorage
                        samesite="Lax" # 有跨站点登录需求的话改成None,同时必须走HTTPS
                    )
                    return response
                else:
                    return HttpResponse('Disabled account')
            else:
                messages.error(request, 'Invalid username or password')
        return render(request, 'account/u_login.html', {'form': form})
    else:
        form = LoginForm
    return render(request, 'account/u_login.html', {'form': form})

3. 前端写入localStorage逻辑

在公共JS或者登录跳转后的页面加入以下代码,读取Cookie中的加密Token写入localStorage,同时处理登出时的清理逻辑:

// 读取Cookie的工具函数
function getCookie(name) {
    let value = "; " + document.cookie;
    let parts = value.split("; " + name + "=");
    if (parts.length === 2) return parts.pop().split(";").shift();
}

// 页面加载时检查Cookie,有Token就写入localStorage
window.addEventListener("load", () => {
    const authToken = getCookie("auth_token");
    if (authToken && !localStorage.getItem("auth_token")) {
        localStorage.setItem("auth_token", authToken);
        // 可选:写入完成后删除Cookie,避免CSRF风险
        // document.cookie = "auth_token=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;";
    }
})

// 登出时同时清理Cookie和localStorage,放到你的登出逻辑里
function handleLogout() {
    localStorage.removeItem("auth_token");
    document.cookie = "auth_token=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;";
}

4. 跨站会话校验

后续跨站点请求时,直接从localStorage取出auth_token放到请求头里传到后端,调用之前写的verify_user_token方法校验即可,无需依赖Django默认的session会话。


注意事项

  • Django的SECRET_KEY要妥善保管,泄露后会导致加密Token可被破解
  • 跨站点登录场景必须开启HTTPS,同时把Cookie的samesite属性设为None、secure设为True
  • 可以根据业务需求调整Token的有效期,避免长期有效带来的安全风险

内容的提问来源于stack exchange,提问作者Bhavya Bibi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 14:27:08