Django令牌:下载具有令牌身份验证的服务器文件

时间:2018-09-11 13:40:05

标签: python django jwt token

我正在寻找集合token authentification,以便以安全的方式下载服务器文件并在到期后添加。

要求:

  • Django 1.11
  • Ubuntu 18.04
  • 数据库PostgreSQL

过程:

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

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

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

预期:

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

用户收到一封电子邮件,该邮件具有基于先前生成的令牌的url链接。当他单击链接时,会有一个身份验证过程,可用来确认用户并打开窗口以下载文档文件。

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

正如我所说,这有点含糊。我必须实现类似的方法,但是我不知道该怎么做。

我的文件:

我认为我有一个可以填写表格,生成令牌并发送电子邮件的类。

然后,我有了这个新类,可以将sha1与数据库进行比较,并将tokenexpiration_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?

1 个答案:

答案 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")