python - Django 令牌:下载带有令牌认证的服务器文件
问题描述
我正在寻找设置token authentification
,以便以安全的方式下载服务器文件并在过期时间后添加。
要求 :
- 姜戈 1.11
- Ubuntu 18.04
- 数据库 PostgreSQL
过程 :
用户用一些信息填写表格,CustomerForm(email, firstname, lastname and country)
他必须选择一个或多个带有复选框的文档。
提交表单时,我创建了一个对象,其中包含用户信息+选择的文档+从格式生成的令牌。email + document_id + datetime
sha1
用户根据之前的文档收到一封带有下载链接的电子邮件(每个文档 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?
解决方案
如果您创建如下所示的 url,则def get(...)
on中的逻辑AppHomeView
可以在允许下载之前解析令牌并检查超时。此外,您可能还想使用LoginRequiredMixin
on 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')
推荐阅读
- javascript - componentDidMount 最初不渲染我的数据,仅在 componentDidUpdate 上
- python - 为不在 Sandia DB(python 库)中的模块系统运行 PVWatts
- react-native - 如何在 react native 上做两个重叠的圆形按钮?
- function - 加载函数时出现问题
- codenameone - OnOffSwitch 控制坏了
- javascript - 将对象文字链接到 HTML 地址
- java - 如何在工件从一个存储库复制到另一个存储库时编辑工件的版本
- phaser-framework - 两体碰撞移相器
- sas - SAS proc Logistics 中的 Strata 语句
- python - Python最后打印出带后缀的整数