如何在Django项目中实现登录时向cookies及localStorage存储加密用户信息
核心改造步骤
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
相关产品推荐
相关产品推荐

