我正在寻找集合token authentification
,以便以安全的方式下载服务器文件并在到期后添加。
要求:
过程:
用户使用某些信息CustomerForm(email, firstname, lastname and country)
填写表格,并且他必须选择一个或多个带有复选框的文档。
提交表单时,我创建了一个对象,其中包含用户信息 + 文档 +从email + document_id + datetime
中生成的令牌 {1}}格式。
用户会根据之前的文档获得一封带有下载链接的电子邮件(每个文档1封电子邮件)。
预期:
在这一部分中,我将解释我想做的事情,但是我不知道这是怎么可能的,并且这一部分在我脑海中仍然很模糊。这是我第一次尝试这样做。
用户收到一封电子邮件,该邮件具有基于先前生成的令牌的url链接。当他单击链接时,会有一个身份验证过程,可用来确认用户并打开窗口以下载文档文件。
但是,过了一段时间(可能是10分钟),令牌已过期,用户必须重新提交表单才能获取文档文件链接。
正如我所说,这有点含糊。我必须实现类似的方法,但是我不知道该怎么做。
我的文件:
我认为我有一个可以填写表格,生成令牌并发送电子邮件的类。
然后,我有了这个新类,可以将sha1
与数据库进行比较,并将token
与expiration_time
也进行比较。
问题是:如果我多次打开链接,则now()
无法实现,并且我的令牌始终有效且不会过期。
now()
这是我在终端中获得的,目的是显示我说的话:
class TokenDownloadView(TemplateView):
template_name = 'app/token.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['token'] = self.kwargs['token']
token = context['token']
print(token)
download = Download.objects.get(token__iexact=token)
if download and download.expiration_date > now:
print("token valide jusqu'à : " + str(download.expiration_date))
print("il est actuellement : " + str(now))
print(' ==> Token existe et valide <==')
if download and download.expiration_date < now:
print("token valide jusqu'à : " + str(download.expiration_date))
print("il est actuellement : " + str(now))
print('==> Token existe mais a expiré <==')
return context
你有什么主意吗?
我怀疑是cookie,应该是这种情况,但是我不知道如何根据令牌删除cookie?
答案 0 :(得分:1)
如果您创建如下所示的网址,则def get(...)
上AppHomeView
中的逻辑可以解析令牌并检查超时,然后再允许下载。另外,您可能需要在LoginRequiredMixin
上使用AppHomeView
。
Django 2.0
path('download/<slug:token>/', views.AppHomeView.as_view(), name="download_document")
Django 1.11
url(r'^download/(?P<slug>[\w-]+)/$', views.AppHomeView.as_view(), name='download_document')
如果您不想将def get(...)
放在AppHomeView
上,则可以有两个单独的视图,并按照Django标准命名,分别命名为AppCreateView(CreateView)
和{{ 1}}并实现AppDownloadView(View)
来解析def get(...)
上的令牌。相应的网址为:
Django 2.0
AppDownloadView(View)
Django 1.11
path('download/<slug:token>/', views.AppDownloadView.as_view(), name="download_document")