Django 令牌:使用令牌身份验证下载服务器文件

Posted

技术标签:

【中文标题】Django 令牌:使用令牌身份验证下载服务器文件【英文标题】:Django token : download server files with token authentification 【发布时间】:2019-02-16 00:57:33 【问题描述】:

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

要求:

Django 1.11 Ubuntu 18.04 数据库 PostgreSQL

流程:

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

提交表单时,我创建了一个对象,其中 user informations + document 选择 + tokenemail + document_id + datetime in sha1 生成格式。

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

预期:

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

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

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

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

我的文件:

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

然后,我有了这个新类,它可以将token 与数据库进行比较,并将expiration_timenow() 进行比较。

问题是:如果我多次打开链接,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

你有什么想法吗?

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

【问题讨论】:

【参考方案1】:

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

Django 2.0

path('download/&lt;slug:token&gt;/', views.AppHomeView.as_view(), name="download_document")

Django 1.11

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

如果您不想将 def get(...) 放在 AppHomeView 上,那么您可以只拥有两个单独的视图,并按照 Django 标准命名,将它们命名为 AppCreateView(CreateView)AppDownloadView(View) 并实现 @987654331 @ 解析AppDownloadView(View) 上的令牌。对应的网址是:

Django 2.0

path('download/&lt;slug:token&gt;/', views.AppDownloadView.as_view(), name="download_document")

Django 1.11

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

【讨论】:

感谢您的回答!我已经完成但到目前为止还没有工作的是我的最后一个问题编辑。但我认为这是很多问题.. 不是很不幸。我相信你的 url 语法 &lt;int:token&gt; 在 Django 1.11 中不起作用,它是在 Django 2.0 中引入的 我为 url 添加了 Django 1.11 语法。您是否能够解析 url 并执行视图逻辑(无论它是否正确执行)?

以上是关于Django 令牌:使用令牌身份验证下载服务器文件的主要内容,如果未能解决你的问题,请参考以下文章

下载文件时如何传递身份验证令牌?

JWT 身份验证:使用 UI 令牌对 Graphene/Django (GraphQL) 查询进行身份验证?

没有用户模型的 Django 基于令牌的身份验证

Django:基于 DRF 令牌的身份验证 VS JSON Web 令牌

带有 okta OAUTH 令牌身份验证的 Django Rest API

无法使用用户名/密码登录令牌端点:drf 令牌身份验证和自定义用户模型,Django