Nomad
NomadЖел. 16, 2020, 12:46 Т.Қ.

Django DRF, JWT Token

jwt, django, drf

Всем привет

Я начал погружение в Django DRF.

Хочу порпосить у читателей поделится качестввенными русскоязычными ссылками на темы:

Django DRF
JWT Token

спасибо

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

15
Илья Чичак
  • Жел. 17, 2020, 5:30 Т.Ж.
  • Жауап шешім ретінде белгіленді.

DRF: https://github.com/ilyachch/django-rest-framework-rusdoc

про JWT - можешь подсказать, как ты его планируешь использовать?
просто я сейчас делаю сервис с SPA фронтом и встал вопрос авторизации. Смотрел на JWT и что-то както не понравилось

    Nomad
    • Жел. 17, 2020, 9:28 Т.Ж.
    • (өңделген)

    JWT это по сути просто токен который отвечает на вопрос пользователь который пользуется данными имеит право пользоватся ими. Данный токен имеит время жизни которое можно контролировать: обнулить(онулировати токен) продлить.
    По моему мнению JWT лучше и проще чем sessions.

    по сути как я понял токен это такая штуковина которая создается на момент когда ты правельно ввел юсер/пасс и в дальнейшем отвечает на вопрос кто ты. т.е кабы ты авторизовался, получил свой токен а дальше когда ты пытаешся дорватся до каких то non-public data то именно по данному токену тебе отвечают да или нет

    спасибо за линк!

      Илья Чичак
      • Жел. 17, 2020, 9:42 Т.Ж.

      как раз таки jwt токен нельзя обнулить или както на него подействовать. пока он жив - им можно пользоваться.
      и получается, либо ставить малое время жизни и постоянно дергать бэк с обновлением токена(что как мне кажется, лучше делать в мобильных приложениях, где есть возможность в фоне обновлять этот токен), либо ставить большое время жизни и не иметь возможности блочить пользователя в реальном времени.
      плюс если ставить малое время жизни, отзывчивость фронта будет страдать - придется делать лишний запрос.

      я для себя сделал вывод, что надо использовать токены (есть в доке drf)

        Nomad
        • Жел. 17, 2020, 9:43 Т.Ж.

        и еще,

        для DRF есть 2 похожих пакета:

        djangorestframework-jwt
        djangorestframework-simplejwt

        если честно я еще не понял в чем разница НО понял что обсалютно во всех найденных мною мануалах, djangorestframework-simplejwt используют в паре с djoser

        djoser это оболочка которая уже имеит внутри сгенерированные ендпоинты для работы с пользователем-токеном

          Nomad
          • Жел. 17, 2020, 9:45 Т.Ж.

          нет, ты не прав.
          вот преставь себе ты авторизовался и получил свой токен. у данного токена есть время жизни которая пропизывается в настройках. теперь ты можешь влиять в любой момент на время жизни токена, она не есть цонстанта которую нельзя менять

            Nomad
            • Жел. 17, 2020, 9:50 Т.Ж.

            когда устанавливаеш djangorestframework-simplejwt то в админке джанго появляетса прилажуха (по сути 2 списка):
            whitelist
            blacklist

            из названия понятно ... как ты думаеш програмно можно делать перемешение токена туда-сюда? думаю да

              Илья Чичак
              • Жел. 17, 2020, 9:51 Т.Ж.

              https://www.vaadata.com/blog/jwt-tokens-and-security-working-principles-and-use-cases/#:~:text=Drawbacks%20of%20JWT%20tokens&text=If%20a%20user%20needs%20to,specified%20by%20the%20standard%20implementation.

              If a user account needs to be blocked or deactivated, the application will have to wait for the token to expire in order for the lockout to be fully effective.
              If a user needs to change their password (for instance in case of account hijacking) and if an authentication has been performed beforehand, then a token generated with the previous password will still be valid until expiry.
              No “refresh” token is specified by the standard implementation. On expiry, the user will therefore have to re-authenticate.
              It is not possible to destroy a token without breaching the “stateless” aspect of JWT tokens : Even if the token is deleted from the browser, it is still valid until expiry, so no real logout is possible.

                Nomad
                • Жел. 17, 2020, 9:58 Т.Ж.

                https://coderoad.ru/31919067/%D0%9A%D0%B0%D0%BA-%D1%8F-%D0%BC%D0%BE%D0%B3%D1%83-%D0%BE%D1%82%D0%BE%D0%B7%D0%B2%D0%B0%D1%82%D1%8C-%D1%82%D0%BE%D0%BA%D0%B5%D0%BD-JWT

                  Илья Чичак
                  • Жел. 17, 2020, 10:15 Т.Ж.

                  в целом, я вас понял, спасибо

                  но я обратил внимание вот на что:

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

                  я не планирую вас отговаривать - я надеялся узнать что-то новое (что и произошло)

                  однако, для себя я решил таки смотреть в сторону https://www.django-rest-framework.org/api-guide/authentication/#tokenauthentication
                  но мне и этот вариант не очень нравится, так как эти токены нельзя экспайрить

                  сейчас я метаюсь между jwt с коротким временем жизни и drf токенами
                  причем, из коробки ни то, ни другое решение меня особо не устраивает

                  если у вас получится сделать то, что вас устраивает, с jwt - буду признателен, если напишете об этом (хотя бы сюда)

                    Nomad
                    • Жел. 17, 2020, 10:31 Т.Ж.

                    спасибо вам за данный обмен мнениями
                    на данный момент я работаю над проектом где буду использовать JWT.
                    с удовольствием поделюсь опытом и раскажу о моем опыте

                      Nomad
                      • Жел. 17, 2020, 1:31 Т.Қ.

                      привет

                      у меня появился вопрос связанный с апи

                      представим что у нас есть приложение с двумя "интерфейсами":
                      1. в браузере
                      2. мобильное прилажение которое по апи тянет данные

                      само сабой нам нужен drf для реализации апи для мобильного приложения.

                      а как вы думаете на сколько хороша идея что апи использовать только для мобильного приложения а для браузера писать на djano template???

                        Илья Чичак
                        • Жел. 17, 2020, 5:43 Т.Қ.
                        • (өңделген)

                        если честно, нужно крайне четко понимать, какой замысел у создаваемого проекта.
                        Мне приходилось делать проект, про который я знал, что он будет работать на достаточно старых и слабых машинах. Поэтому я делал его обычными шаблонами и не парился (с минимум или вообще без JS). Сейчас я делаю проект, для которого фронт будет отдельным JS приложением. Поэтому тут стоит исходить из задачи

                        в дополнение, если проект на мобилке и в браузере будет выполнять примерно одно и то же, советую вынуть всю логику сложить в отдельное место, из которого одной и той же логикой будет пользоваться и рендеринг и апи

                        вообще, сделав не самое малое количество проектов (и, прочитав некоторое количество книг), я для себя выявил следующую структуру проекта:

                        Модели (на этом уровне я для себя решил не оставлять никакой логики, типа User.objects.get(id=100).activate()) - только структура базы + некоторые вычисляемые свойства
                        сервисы (собственно сама логика. Кстати, последнее время я подсел на Pydantic - позволяет писать сервисы достаточно прикольно + очень сложно сделать что-то развесистое)
                        валидаторы (в случае и шаблонами - формы и их метод clean, в случае drf - сериализаторы и их метод validate())
                        представления - то, что должно обработать действия пользователя и в зависимости от этого самого действия его провалидировать и произвести некоторое действие

                        шаблоны - опциональный слой, так как с апи его нет

                        я стремлюсь к тому, чтобы представление моего ендпоинта было примерно таким:

                        # класс API
                        class CreateUserAPIView(APIView):
                            auth_class = (AnonimOnly,)
                            serializer = UserCreationSerializer
                            service = UserCreationService
                        
                            def post(self, request, *args, **kwargs):
                                serializer = self.serializer_class(data=request.data)
                                serializer.is_valid(raise_exception=True)
                                data = self.service(**serializer.data).execute()
                                return Response(data, status=status.HTTP_201_CREATED)
                        
                        # класс обычной вьюхи
                        class CreateUserView(View):
                            form = CreateUserView
                            service = UserCreationService
                        
                            def get(request, *args, **kwargs):
                                form = self.form()
                                return response('/path/to/template', request, {'form': form})
                        
                            def post(request, *args, **kwargs):
                                form = self.form(request.POST)
                                if form.is_valid():
                                    data = self.service(form.cleaned_data).execute()
                                    return response('/path/to/another/template', request, data)
                                return response('/path/to/template', request, {'form': form})
                        

                        по поводу "само собой" - не согласен. Можно использовать тот же GraphQL. Да и не DRF-ом единым
                        можно вообще самому написать все - тогда будет максимальная свобода и гибкость=)

                        но, справедливаости ради, DRF-а в большинстве задач хватит, да

                        ну и вернувшись к главному вопросу - исходя из проблемы, которую вы хотите решить
                        если все раскидано по слоям - написать АПИ поверх готовых сервисов и моделей - не сложно (ну или сделать генерацию из шаблонов на основе все той же структуры)

                        если хотите меньше головной боли - делайте все через АПИ (последнее время ловлю себя на мысли, что для того, чтобы реализовать некоторые мои затеи - придется воротить жуть в шаблонах)

                        если хотите поковыряться в фронтенде - посмотрите на nuxt - мне, как закоренелому бэкендеру, достаточно просто было разобраться (не надо конфигурить вебпак и прочее)

                          Илья Чичак
                          • Қаң. 7, 2021, 5:05 Т.Ж.
                          • (өңделген)

                          кстати, я поигрался с JWT в связке с SSR SPA приложением на JS.
                          реализация: refresh token в httponly куку, обычный токен - на 15 минут. фронт - nuxt
                          мне таки не понравилось. Аргументы в студию:

                          логин - тут все просто. логин+пароль - в ответ токен. токен храним в рантайме
                          пользователь открывает новую вкладку - делаем запрос на рефреш токена, получаем токен2, с ним делаем запросы, формируем страницу, отдаем. медленно (рефреш запрос блокирует остальные запросы), но пусть будет
                          токен протух - бывает. но в какой момент мы это узнаем - делать рефреш запрос кажые 5 минут? я попробовал так - получилось сделать запрос? нет? тогда рефреш и снова пробуем. но тут возникает 2 лишних запроса (а сетевое взаимодействие - долгое). получается каждые +-15 минут приложение будет подвисать. что-то как-то не очень
                          логаут - все оч просто. затерли токен в рантайме и нормально. но как его убрать на других вкладках? использовать localStorage? не безопасно. допустим мы используем шароковещательное сообщение, которое ловим на остальных вкладках. ок
                          а как убрать куку с рефреш токеном? кука - httponly (безопасность, все дела). к ней доступа из js нет. получается либо делать запрос на сервер, чтобы либо убрать ее, либо блэклистить (запрос по сети + запрос в базу + увеличение длительности рефреш запросов - надо проверять, что рефреш токен из куки не в черном списке)
                          и получается, если не делать дозапросов - если пользователь откроет новую вкладку, мы получим куку, обновим токен и все снова работает, хотя пользователь делал логаут. безопасность уровня "решето"

                          в целом, я подозреваю, что я что-то сделал не так + я не очень умею в JS, поэтому делал как умею. Но, я делал сессионную авторизацию (с небольшими танцами вопруг кроссайт запросов) и все работает крайне хорошо (+ широковещательное сообщение logout), чтобы остальные вкладки тоже вышли.

                          если у вас более удачный опыт - я буду крайне признателен, если поделитесь

                            Nomad
                            • Қаң. 11, 2021, 10:35 Т.Ж.

                            приветствую

                            скажите а вы в setting.py прописали значение для пораметра: 'JWT_EXPIRATION_DELTA' ?

                              Илья Чичак
                              • Қаң. 11, 2021, 12:20 Т.Қ.

                              я писал сам все
                              у меня аналог этой дельты был 15 минут

                                Пікірлер

                                Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
                                Кіріңіз немесе Тіркеліңіз
                                OI
                                • Ora Iro
                                • Жел. 24, 2024, 6:38 Т.Ж.

                                C++ - Тест 001. Первая программа и типы данных

                                • Нәтиже:40ұпай,
                                • Бағалау ұпайлары-8
                                AD

                                C++ - Тест 004. Указатели, Массивы и Циклы

                                • Нәтиже:50ұпай,
                                • Бағалау ұпайлары-4
                                m
                                • molni99
                                • Қаз. 26, 2024, 1:37 Т.Ж.

                                C++ - Тест 004. Указатели, Массивы и Циклы

                                • Нәтиже:80ұпай,
                                • Бағалау ұпайлары4
                                Соңғы пікірлер
                                ИМ
                                Игорь МаксимовҚар. 22, 2024, 11:51 Т.Ж.
                                Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                                Evgenii Legotckoi
                                Evgenii LegotckoiҚаз. 31, 2024, 2:37 Т.Қ.
                                Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                                A
                                ALO1ZEҚаз. 19, 2024, 8:19 Т.Ж.
                                Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                                ИМ
                                Игорь МаксимовҚаз. 5, 2024, 7:51 Т.Ж.
                                Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                                d
                                dblas5Шілде 5, 2024, 11:02 Т.Ж.
                                QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                                Енді форумда талқылаңыз
                                Evgenii Legotckoi
                                Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
                                добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                                t
                                tonypeachey1Қар. 15, 2024, 6:04 Т.Ж.
                                google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                                NSProject
                                NSProjectМаусым 4, 2022, 3:49 Т.Ж.
                                Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
                                9
                                9AnonimҚаз. 25, 2024, 9:10 Т.Ж.
                                Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

                                Бізді әлеуметтік желілерде бақылаңыз