注册后在电子邮件中发送激活码

时间:2018-01-05 03:39:40

标签: django email authentication django-rest-framework jwt

正如我们在不同的网站上看到的,在注册后它会在我们的电子邮件中发送6/5字符的激活码。我们使用该激活码来激活我们的帐户。 我试图做同样的事情,但无法弄清楚如何在django-rest-framework中做到这一点

目前,我正在使用Djoser进行注册和激活。 Djoser在电子邮件中发送激活URL并且工作正常。 如何通过6个字母数字字符的激活码替换激活URL以进行帐户激活?

使用: Django的REST的框架, Django的REST的Fraework,智威汤逊, Djoser

3 个答案:

答案 0 :(得分:1)

不是创建随机值,而是编码一些唯一的用户数据并将其附加到网址。像这样

import jwt
data = {'email' : "test@test.com"} # Some unique field for reference
secret_key = "test"
algorithm = "HS256" # You can use MD5 or whatever you want
jwt.encode(data, secret_key, algorithm)

点击邮件激活网址后,您可以解码并验证数据库中的唯一字段。为此,您不希望将代码保存在DB中。这是我的建议

答案 1 :(得分:1)

我在项目中使用了以下内容的变体:

# models.py
import random

from django.conf import settings
from django.db import models


def generate_activation_code():
    return ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(6))


class ActivationCode(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT)
    code = models.CharField(max_length=6, default=generate_activation_code)


# views.py
from django.http import Http404

def register_user(request):
    # create your `new_user` however you see fit
    code = ActivationCode.objects.create(user=new_user)
    send_mail(
        'Activate Your Account',
        'Here is the activation code: %s' % code,
        'from@example.com',
        [user.email]
    )
    render(request, 'activation_sent.html')

def check_activation_code(request, code):
    try:
        ActivationCode.objects.get(code=code)
        # ... All set, activate & login the user, & delete the activation code
    except ActivationCode.DoesNotExist:
        raise Http404

    return render(request, 'welcome.html')

增强功能可以包括向您在视图中签入的ActivationCode添加到期日期,和/或为清除旧代码添加管理工作。

答案 2 :(得分:0)

您可以生成6位数的随机数:

import random  
codeval = random.randint(111111,999999)

并通过电子邮件发送。并且您可以保持与随机数完全相同的副本。而当用户将给他的号码。您可以将其与存储的匹配。如果匹配则您将激活用户配置文件。