Nomad16 грудня 2020 р. 12:46
Django DRF, JWT Token
Всем привет
Я начал погружение в Django DRF.
Хочу порпосить у читателей поделится качестввенными русскоязычными ссылками на темы:
Django DRF
JWT Token
спасибо
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.Вам це подобається? Поділіться в соціальних мережах!
AD
- Akiv Doros
- 11 листопада 2024 р. 14:58
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:50бали,
- Рейтинг балів-4
m
- molni99
- 26 жовтня 2024 р. 01:37
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:80бали,
- Рейтинг балів4
m
- molni99
- 26 жовтня 2024 р. 01:29
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:20бали,
- Рейтинг балів-10
Останні коментарі
ИМ
Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Игорь Максимов22 листопада 2024 р. 11:51
Evgenii Legotckoi31 жовтня 2024 р. 14:37
Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
Игорь Максимов05 жовтня 2024 р. 07:51
QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Тепер обговоріть на форумі
Evgenii Legotckoi24 червня 2024 р. 15:11
t
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
tonypeachey115 листопада 2024 р. 06:04
NSProject04 червня 2022 р. 03:49
IscanderChe31 жовтня 2024 р. 15:43
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
DRF: https://github.com/ilyachch/django-rest-framework-rusdoc
про JWT - можешь подсказать, как ты его планируешь использовать?
просто я сейчас делаю сервис с SPA фронтом и встал вопрос авторизации. Смотрел на JWT и что-то както не понравилось
JWT это по сути просто токен который отвечает на вопрос пользователь который пользуется данными имеит право пользоватся ими. Данный токен имеит время жизни которое можно контролировать: обнулить(онулировати токен) продлить.
По моему мнению JWT лучше и проще чем sessions.
по сути как я понял токен это такая штуковина которая создается на момент когда ты правельно ввел юсер/пасс и в дальнейшем отвечает на вопрос кто ты. т.е кабы ты авторизовался, получил свой токен а дальше когда ты пытаешся дорватся до каких то non-public data то именно по данному токену тебе отвечают да или нет
спасибо за линк!
как раз таки jwt токен нельзя обнулить или както на него подействовать. пока он жив - им можно пользоваться.
и получается, либо ставить малое время жизни и постоянно дергать бэк с обновлением токена(что как мне кажется, лучше делать в мобильных приложениях, где есть возможность в фоне обновлять этот токен), либо ставить большое время жизни и не иметь возможности блочить пользователя в реальном времени.
плюс если ставить малое время жизни, отзывчивость фронта будет страдать - придется делать лишний запрос.
я для себя сделал вывод, что надо использовать токены (есть в доке drf)
и еще,
для DRF есть 2 похожих пакета:
djangorestframework-jwt
djangorestframework-simplejwt
если честно я еще не понял в чем разница НО понял что обсалютно во всех найденных мною мануалах, djangorestframework-simplejwt используют в паре с djoser
djoser это оболочка которая уже имеит внутри сгенерированные ендпоинты для работы с пользователем-токеном
нет, ты не прав.
вот преставь себе ты авторизовался и получил свой токен. у данного токена есть время жизни которая пропизывается в настройках. теперь ты можешь влиять в любой момент на время жизни токена, она не есть цонстанта которую нельзя менять
когда устанавливаеш djangorestframework-simplejwt то в админке джанго появляетса прилажуха (по сути 2 списка):
whitelist
blacklist
из названия понятно ... как ты думаеш програмно можно делать перемешение токена туда-сюда? думаю да
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.
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
в целом, я вас понял, спасибо
но я обратил внимание вот на что:
я не планирую вас отговаривать - я надеялся узнать что-то новое (что и произошло)
однако, для себя я решил таки смотреть в сторону https://www.django-rest-framework.org/api-guide/authentication/#tokenauthentication
но мне и этот вариант не очень нравится, так как эти токены нельзя экспайрить
сейчас я метаюсь между jwt с коротким временем жизни и drf токенами
причем, из коробки ни то, ни другое решение меня особо не устраивает
если у вас получится сделать то, что вас устраивает, с jwt - буду признателен, если напишете об этом (хотя бы сюда)
спасибо вам за данный обмен мнениями
на данный момент я работаю над проектом где буду использовать JWT.
с удовольствием поделюсь опытом и раскажу о моем опыте
привет
у меня появился вопрос связанный с апи
представим что у нас есть приложение с двумя "интерфейсами":
1. в браузере
2. мобильное прилажение которое по апи тянет данные
само сабой нам нужен drf для реализации апи для мобильного приложения.
а как вы думаете на сколько хороша идея что апи использовать только для мобильного приложения а для браузера писать на djano template???
если честно, нужно крайне четко понимать, какой замысел у создаваемого проекта.
Мне приходилось делать проект, про который я знал, что он будет работать на достаточно старых и слабых машинах. Поэтому я делал его обычными шаблонами и не парился (с минимум или вообще без JS). Сейчас я делаю проект, для которого фронт будет отдельным JS приложением. Поэтому тут стоит исходить из задачи
в дополнение, если проект на мобилке и в браузере будет выполнять примерно одно и то же, советую вынуть всю логику сложить в отдельное место, из которого одной и той же логикой будет пользоваться и рендеринг и апи
вообще, сделав не самое малое количество проектов (и, прочитав некоторое количество книг), я для себя выявил следующую структуру проекта:
Модели (на этом уровне я для себя решил не оставлять никакой логики, типа User.objects.get(id=100).activate()) - только структура базы + некоторые вычисляемые свойства
сервисы (собственно сама логика. Кстати, последнее время я подсел на Pydantic - позволяет писать сервисы достаточно прикольно + очень сложно сделать что-то развесистое)
валидаторы (в случае и шаблонами - формы и их метод clean, в случае drf - сериализаторы и их метод validate())
представления - то, что должно обработать действия пользователя и в зависимости от этого самого действия его провалидировать и произвести некоторое действие
шаблоны - опциональный слой, так как с апи его нет
я стремлюсь к тому, чтобы представление моего ендпоинта было примерно таким:
по поводу "само собой" - не согласен. Можно использовать тот же GraphQL. Да и не DRF-ом единым
можно вообще самому написать все - тогда будет максимальная свобода и гибкость=)
но, справедливаости ради, DRF-а в большинстве задач хватит, да
ну и вернувшись к главному вопросу - исходя из проблемы, которую вы хотите решить
если все раскидано по слоям - написать АПИ поверх готовых сервисов и моделей - не сложно (ну или сделать генерацию из шаблонов на основе все той же структуры)
если хотите меньше головной боли - делайте все через АПИ (последнее время ловлю себя на мысли, что для того, чтобы реализовать некоторые мои затеи - придется воротить жуть в шаблонах)
если хотите поковыряться в фронтенде - посмотрите на nuxt - мне, как закоренелому бэкендеру, достаточно просто было разобраться (не надо конфигурить вебпак и прочее)
кстати, я поигрался с JWT в связке с SSR SPA приложением на JS.
реализация: refresh token в httponly куку, обычный токен - на 15 минут. фронт - nuxt
мне таки не понравилось. Аргументы в студию:
логин - тут все просто. логин+пароль - в ответ токен. токен храним в рантайме
пользователь открывает новую вкладку - делаем запрос на рефреш токена, получаем токен2, с ним делаем запросы, формируем страницу, отдаем. медленно (рефреш запрос блокирует остальные запросы), но пусть будет
токен протух - бывает. но в какой момент мы это узнаем - делать рефреш запрос кажые 5 минут? я попробовал так - получилось сделать запрос? нет? тогда рефреш и снова пробуем. но тут возникает 2 лишних запроса (а сетевое взаимодействие - долгое). получается каждые +-15 минут приложение будет подвисать. что-то как-то не очень
логаут - все оч просто. затерли токен в рантайме и нормально. но как его убрать на других вкладках? использовать localStorage? не безопасно. допустим мы используем шароковещательное сообщение, которое ловим на остальных вкладках. ок
а как убрать куку с рефреш токеном? кука - httponly (безопасность, все дела). к ней доступа из js нет. получается либо делать запрос на сервер, чтобы либо убрать ее, либо блэклистить (запрос по сети + запрос в базу + увеличение длительности рефреш запросов - надо проверять, что рефреш токен из куки не в черном списке)
и получается, если не делать дозапросов - если пользователь откроет новую вкладку, мы получим куку, обновим токен и все снова работает, хотя пользователь делал логаут. безопасность уровня "решето"
в целом, я подозреваю, что я что-то сделал не так + я не очень умею в JS, поэтому делал как умею. Но, я делал сессионную авторизацию (с небольшими танцами вопруг кроссайт запросов) и все работает крайне хорошо (+ широковещательное сообщение logout), чтобы остальные вкладки тоже вышли.
если у вас более удачный опыт - я буду крайне признателен, если поделитесь
приветствую
скажите а вы в setting.py прописали значение для пораметра: 'JWT_EXPIRATION_DELTA' ?
я писал сам все
у меня аналог этой дельты был 15 минут