首页 > 解决方案 > Django 令牌:下载带有令牌认证的服务器文件

问题描述

我正在寻找设置token authentification,以便以安全的方式下载服务器文件并在过期时间后添加。

要求 :

过程 :

用户用一些信息填写表格,CustomerForm(email, firstname, lastname and country)他必须选择一个或多个带有复选框的文档。

提交表单时,我创建了一个对象,其中包含用户信息+选择的文档+从格式生成的令牌email + document_id + datetimesha1

用户根据之前的文档收到一封带有下载链接的电子邮件(每个文档 1 封电子邮件)。

预期的 :

在这部分中,我将解释我想做什么,但我不知道这怎么可能,这部分在我的脑海中仍然很模糊。这是我第一次尝试这样做。

用户收到一封电子邮件,其中包含基于先前生成的令牌的 url 链接。当他点击链接时,有一个验证过程,可以确认用户并打开一个窗口以下载文档文件。

但是,过了一段时间(可能是 10 分钟),令牌就会过期,用户必须重新提交表单才能获得文档文件链接。

正如我所说,它有点模糊。我必须实现类似的东西,但我不知道我该怎么做。

我的文件 :

在我看来,我有一门课可以填写表格、生成令牌并发送电子邮件。

然后,我有了这个新类,它可以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

这就是我在终端中获得的,以显示我所说的:

d0ce9328a53032d4484cccff4c0bdd92ad701567
token valide jusqu'à : 2018-09-12 07:46:30.082915+00:00
il est actuellement : 2018-09-12 07:45:30.082915+00:00
 ==> Token existe et valide <==
[12/Sep/2018 09:45:42] "GET /crud/download/token/d0ce9328a53032d4484cccff4c0bdd92ad701567/ HTTP/1.1" 200 7447
[12/Sep/2018 09:45:42] "GET /static/css/common-8073709e.css HTTP/1.1" 404 1682
d0ce9328a53032d4484cccff4c0bdd92ad701567
token valide jusqu'à : 2018-09-12 07:46:30.082915+00:00
il est actuellement : 2018-09-12 07:45:30.082915+00:00
 ==> Token existe et valide <==
[12/Sep/2018 09:46:10] "GET /crud/download/token/d0ce9328a53032d4484cccff4c0bdd92ad701567/ HTTP/1.1" 200 7447
[12/Sep/2018 09:46:10] "GET /static/css/common-8073709e.css HTTP/1.1" 404 1682
d0ce9328a53032d4484cccff4c0bdd92ad701567
token valide jusqu'à : 2018-09-12 07:46:30.082915+00:00
il est actuellement : 2018-09-12 07:45:30.082915+00:00
 ==> Token existe et valide <==
[12/Sep/2018 09:46:30] "GET /crud/download/token/d0ce9328a53032d4484cccff4c0bdd92ad701567/ HTTP/1.1" 200 7447
[12/Sep/2018 09:46:30] "GET /static/css/common-8073709e.css HTTP/1.1" 404 1682
d0ce9328a53032d4484cccff4c0bdd92ad701567
token valide jusqu'à : 2018-09-12 07:46:30.082915+00:00
il est actuellement : 2018-09-12 07:45:30.082915+00:00
 ==> Token existe et valide <==
[12/Sep/2018 09:46:41] "GET /crud/download/token/d0ce9328a53032d4484cccff4c0bdd92ad701567/ HTTP/1.1" 200 7447
[12/Sep/2018 09:46:41] "GET /static/css/common-8073709e.css HTTP/1.1" 404 1682

你有什么主意吗 ?

我怀疑 cookie 应该是这样,但我不知道如何根据 token 删除 cookie?

标签: pythondjangojwttoken

解决方案


如果您创建如下所示的 url,则def get(...)on中的逻辑AppHomeView可以在允许下载之前解析令牌并检查超时。此外,您可能还想使用LoginRequiredMixinon AppHomeView

姜戈 2.0

path('download/<slug:token>/', views.AppHomeView.as_view(), name="download_document")

姜戈 1.11

url(r'^download/(?P<slug>[\w-]+)/$', views.AppHomeView.as_view(), name='download_document')

如果您不想def get(...)将. AppHomeView_ AppCreateView(CreateView)_ 相应的网址将是:AppDownloadView(View)def get(...)AppDownloadView(View)

姜戈 2.0

path('download/<slug:token>/', views.AppDownloadView.as_view(), name="download_document")

姜戈 1.11

url(r'^download/(?P<slug>[\w-]+)/$', views.AppDownloadView.as_view(), name='download_document')


推荐阅读