首页 > 编程问答 >如何在 Django Web 应用程序中临时存储用户凭据以进行电子邮件验证?

如何在 Django Web 应用程序中临时存储用户凭据以进行电子邮件验证?

时间:2024-08-08 15:03:42浏览次数:11  
标签:python django authentication email email-verification

我想创建自己的电子邮件验证流程,其中用户输入其凭据并获取给定电子邮件的 OTP。当用户在 10 分钟的时限内输入正确的 OTP 时,它将注册该用户,并且他的凭据将永久存储在我的数据库中。 如何在 10 分钟的时间限制内临时存储凭证?

我正在考虑使用 django_pbkdf2_sha256 库哈希后存储凭证,并将其存储在我的 redis 缓存中 10 分钟。如果用户在此时间之后尝试输入,他们将需要新的 OTP 才能注册。这是一个好主意吗 ?


将敏感信息(例如用户凭据)存储在缓存中(即使是经过哈希处理的)也存在安全风险。以下是一些需要考虑的风险:

  • 缓存安全漏洞: 如果你的缓存服务器遭到入侵,攻击者可能会访问缓存的数据,包括经过哈希处理的凭据。
  • 未经授权的访问: 如果缓存配置不当,可能会导致未经授权的用户访问缓存的数据。
  • 数据持久性: 缓存通常用于快速数据检索,并且可能无法保证数据的持久性。如果缓存服务器重启,数据可能会丢失。

更安全的方案是:

  1. 仅存储验证令牌:
  2. 生成一个唯一的、随机的、安全的验证令牌,并将其与用户的电子邮件地址和时间戳一起存储在数据库中。
  3. 将包含此令牌的链接发送到用户的电子邮件地址。
  4. 当用户点击链接时,检索与令牌关联的电子邮件地址,并检查时间戳是否在 10 分钟内。
  5. 如果有效,则允许用户设置密码并完成注册过程。

  6. 使用 Django 的内置密码重置机制:

  7. Django 提供了一个内置的密码重置系统,该系统可以轻松地适应电子邮件验证。
  8. 用户提交其电子邮件地址后,Django 会发送一封包含唯一链接的电子邮件。
  9. 该链接允许用户设置密码并完成注册。

改进你的方法:

  • 不要存储经过哈希处理的密码: 即使使用强大的哈希函数,存储经过哈希处理的密码也存在风险。
  • 使用安全的令牌生成器: 使用 secrets.token_urlsafe() 生成安全且唯一的令牌。
  • 设置令牌的过期时间: 在数据库中存储令牌的创建时间,并在 10 分钟后使其过期。

示例代码(使用验证令牌):

from django.core.mail import send_mail
from django.utils.http import urlsafe_base64_encode
from django.utils.encoding import force_bytes
from django.template.loader import render_to_string
from django.contrib.auth.tokens import default_token_generator
from .models import User

def send_verification_email(user):
    token = default_token_generator.make_token(user)
    uid = urlsafe_base64_encode(force_bytes(user.pk))
    verification_link = f'https://yourdomain.com/verify/{uid}/{token}'

    subject = 'Verify Your Email Address'
    message = render_to_string('accounts/verification_email.html', {
        'verification_link': verification_link,
        'user': user,
    })
    send_mail(subject, message, '[email protected]', [user.email])

def verify_email(request, uidb64, token):
    try:
        uid = urlsafe_base64_decode(uidb64).decode()
        user = User.objects.get(pk=uid)
    except (TypeError, ValueError, OverflowError, User.DoesNotExist):
        user = None

    if user is not None and default_token_generator.check_token(user, token):
        # 验证成功
        user.is_active = True
        user.save()
        # 登录用户或重定向到成功页面
    else:
        # 无效的令牌
        # 显示错误消息

请记住,安全是一个持续的过程,建议你始终使用最新的安全实践并定期审查你的代码以查找潜在的漏洞。

标签:python,django,authentication,email,email-verification
From: 78846841

相关文章

  • Python爬虫实战:实时微信推送奥运奖牌榜信息
    最近奥运会正在巴黎如火如荼地进行。为了能第一时间获得我国运动健儿的获奖情况,我给大家分享一个python爬虫项目——实时微信推送奥运奖牌榜信息。爬虫每隔5分钟抓取一次奥林匹克官网奖牌榜数据,对比上次抓取的数据,如果奖牌数量或者排名有变化,就将新的获奖信息推送到......
  • django特定地区冷链物流信息调度系统-计算机毕业设计源码92919
    摘要本研究针对特定地区的冷链物流信息调度系统进行了深入探索与实践。冷链物流作为一种特殊的物流方式,对于保障食品、药品等易腐产品的新鲜度和质量至关重要。然而,在特定地区,由于地理环境、经济水平和物流资源的限制,冷链物流面临着诸多挑战。因此,本研究旨在开发一套高效、智......
  • 基于Python实现可视化分析中国500强排行榜数据的设计与实现
    基于Python实现可视化分析中国500强排行榜数据的设计与实现“DesignandImplementationofVisualAnalysisforChina’sTop500CompaniesRankingDatausingPython”完整下载链接:基于Python实现可视化分析中国500强排行榜数据的设计与实现文章目录基于Python......
  • python使用selenium和PyPDF2保存多个html页面为pdf
    检索资料时看到比较完备的资料,想着要把所有页面保存下来。正好使用下requests和BeautifulSoup库获取和解析所有的静态页,把静态页保存为单个pdf文件,然后再把所有的pdf文件合并起来生成1个PDF文档。本来想使用python子进程调用wkhtmltopdf工具把静态页生成为单个pdf,然而如此一来pdf......
  • Python编码规范常用技巧
    Python编码规范常用技巧开场白:Python编码规范的艺术从一团乱麻到井然有序:我的Python代码进化史PEP8:Python编码规范的圣经为什么遵循编码规范如此重要命名约定:给你的代码起个好名字变量名:不只是标识符那么简单函数命名:让意图一目了然类与方法:面向对象的命名艺术代码结......
  • Python实现游戏中的音效制作与环境声音设计
    Python实现游戏中的音效制作与环境声音设计开场白:让声音活起来——游戏音频的魅力为什么游戏中的声音如此重要?个人体验分享:那些让人难忘的游戏音效Python在音频处理中的应用概览基础篇:Python环境搭建与音频库介绍快速入门:安装Python及必备音频处理库库推荐:pydub、soundf......
  • 计算机毕业设计django+vue好生活线上超市购物系统的设计与实现【开题+论文+程序】
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,电子商务已成为人们日常生活中不可或缺的一部分,特别是线上超市购物平台的兴起,极大地便利了消费者的购物体验。然......
  • python拆分PDF文件
    先占个空,后面在慢慢更新下面这个代码实现讲一个PDF文件拆分成多个文件importPyPDF2defsplit_pdf(input_pdf_path,output_prefix,start_page,end_page):"""分割PDF文件为多个小的PDF文件,每个文件包含原始文档的一部分页面。:paraminput_pdf_path:输入......
  • Python动态执行代码
    在Python中,动态执行代码是一个强大的特性,它允许程序在运行时编译和执行字符串或存储在文件、数据库等中的代码。这种能力使得Python在需要高度灵活性和动态性的应用中特别有用,比如科学计算、数据分析、Web开发以及自动化脚本等。下面,我将详细介绍Python中动态执行代码的几种......
  • 在Python中,模块(Module)和包(Package)
    在Python中,模块(Module)和包(Package)是组织代码、提高代码复用性、促进代码维护的两种重要机制。它们各自扮演着不同的角色,但又紧密相连,共同构成了Python程序架构的基础。以下将详细阐述Python中模块和包的概念及其区别。一、模块(Module)的概念在Python中,模块是一个包含了Pyth......