Токен Django: загрузка файлов сервера с аутентификацией токена - PullRequest
0 голосов
/ 11 сентября 2018

Я ищу набор token authentification, чтобы загружать файлы сервера безопасным способом и добавлять по истечении срока действия.

Требования:

  • Django 1.11
  • Ubuntu 18.04
  • База данных PostgreSQL

Процесс:

Пользователь заполняет форму с некоторыми данными CustomerForm(email, firstname, lastname and country), и он должен выбрать один или несколько документов с флажками.

Когда форма отправлена, я создаю объект с пользовательской информацией + документ choosen + токен , сгенерированный из email + document_id + datetime в sha1формат.

Пользователь получает электронное письмо со ссылкой для скачивания в соответствии с предыдущими документами (1 электронное письмо на документ).

Ожидаемое:

В этой части я объясню, что я хотел бы сделать, но я не знаю, как это возможно, и эта часть все еще размыта в моей голове.Это первый раз, когда я пытаюсь это сделать.

Пользователь получает электронное письмо со ссылкой на основе созданного ранее токена.Когда он нажимает на ссылку, происходит процесс аутентификации, который позволяет подтвердить пользователя и открыть окно для загрузки файла документа.

Но через некоторое время (возможно, 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

Есть ли у вас какие-либо идеи?

Я подозреваю, куки, и это должно быть так, но я не знаю, как яможно удалить куки по токену?

1 Ответ

0 голосов
/ 11 сентября 2018

Если вы создадите URL-адрес, подобный следующему, ваша логика в 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) и AppDownloadView(View) и реализовыватьdef get(...), который анализирует токен на AppDownloadView(View).Соответствующий URL будет:

Джанго 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')

...