如何在Django中使用用户的unique_id和令牌发送url?

时间:2019-03-08 11:58:41

标签: django django-csrf

我为大学创建了Django应用程序(“浏览器管理系统”)。我没有包括任何登录授权,因为它将仅由大学管理员使用。在此应用程序中,我还有一项任务,我必须针对数据库中的所有用户以邮件形式发送可用性表格,要求他们根据我必须存储的响应,填写是否当天可用的表格它们在数据库中的可用性状态。如何通过邮件发送表格? 还是应该给他们发送表格链接? 如果必须发送链接,如何更改一个用户的链接,如何添加令牌以及其唯一ID来防止一个用户访问其他用户的表单?

1 个答案:

答案 0 :(得分:0)

发送具有唯一令牌的电子邮件。

生成令牌:

使用用户的字段作为盐生成随机令牌。 可以是一个或多个字段,例如名字,姓氏,用户标识等。 似乎您没有庞大的用户群,并且令牌重复的可能性更低。

如何生成令牌?

有许多软件包可以帮助您生成随机令牌。 根据我的经验,我发现uuidsecretshashlib很有帮助,当然这些是内置在库中的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'),
]

我想你有要点了。