发送带有唯一令牌的电子邮件。
生成令牌:
使用用户字段作为salt生成随机令牌。
可以是一个或多个字段,如名字、姓氏、用户名等。
似乎你没有大的用户群,而且复制令牌的可能性较小。
如何生成令牌?
有许多包可以帮助您生成随机令牌。
根据我的经验
uuid
,
secrets
,
hashlib
当然,这些是python内置的库。
例子:
>>> import uuid
>>> print(uuid.uuid4().hex)
'772d4c80-3668-4980-a014-aae59e34b9b9'
>>> import secrets
>>> secrets.token_hex(8)
'15653f73b28182f2'
# random token and user's field combination as salt
import uuid, hashlib
>>> first_name = user.first_name # pull user from database
>>> salt = uuid.uuid4().hex + first_name
>>> hashlib.sha256(salt.encode('utf-8')).hexdigest()
'effc7a5b0c42bcb53f196b3a6a49065c49ee2add53aa71db89a3d4b9f4fbebcb'
似乎生成随机令牌现在已完成。
现在将您的随机令牌分别存储在您的数据库中的用户,如果您想更确定令牌不存在于数据库中,请在存储到数据库之前检查它是否存在。
唯一令牌模型示例:
from django.db import models
from django.contrib.auth.models import User
from django.utils import timezone
class UserUniqueToken(models.Model):
user_id = models.ForeignKey(User, on_delete=models.CASCADE)
token = models.Charfieled(max_length=100)
datetime = models.DateTime(default=timezone.now) # for token expiration
如何检查令牌有效性?
很简单。
views.py
:
from .models import UserUniqueToken
from django.shortcuts import get_object_or_404
from django.contrib.auth.decorators import login_required
from djano.utils import timezone
from datetime import timedelta
@login_required
def user_form(request, token):
user_token = get_object_or_404(UserUniqueToken, token=token) # get object or throw 404
if not user_token.user_id == request.user.id: # check token belongs to the user
# do something
time_now = timezone.now() # get current time
if user_token.datetime > (time_now - timedelta(hours=2)): # check if stored time exceeds 2 hours
# do something with expired token
return render(.............)
urls.py
:
from .views import user_form
urlpatterns = [
path('form/<string:token>', user_form, name='user-form'),
]
我想你明白要点了。