LINUX.ORG.RU

JWT и извращенцы

 ,


0

4

Читая статейки на тему использования JWT в веб приложениях невольно возникает вопрос о том кто же больший извращенец - авторы RFC или те кто его использует?
Чуть ли каждый в срачах о том как же нужно инвалидировать токен, как его отозвать имеет свое мнение на эту тему. При этом встречаются костыли навроде создания блеклиста в редисах(смысл в селфконтейнед токене?) и как самый кошерный вариант - использование рефреш токена(еще один, рили?).
А посмотрев на популярные библиотеки для работы с JWT на нескольких платформах, я пришел к выводу что ни одна из них не реализует данный функционал.
Ну, а че - аутентификацию прошел? Прошел! Токен получил? Получил. sign out для слабаков. Бан юзера, смена пароля, роли? Зачем? Ненужно.
И вот сижу я в 7 утра, с лицом братишки которому принесли покушать и уже готов писать очередной лисапед.
Может я что-то не так понял и просто плохо искал? Так вот, посоветуйте какой проектов или поделитесь своими наработками.

★★★★★

Ответ на: комментарий от VladimirMalyk

Чтобы отозвать, например. Пользователь что не имеет права «разлогиниться» до конца действия токена?
Офкорс, я могу изменить ключ для инвалидации всех токенов, но это не вариант.
Так что похоже классические сессии мне больше подходят.

ritsufag ★★★★★
() автор топика
Ответ на: комментарий от ritsufag

разлогиниться это синоним «разавторизоваться».
и то, как ты это реализуешь, никоим боком не касается jwt.

jwt он про другое.
jwt про аутентификацию json-а, который в нем лежит.
другими словами, проверив подпись, ты гарантируешь что json аутентичный.

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

VladimirMalyk ★★★★★
()
Ответ на: комментарий от VladimirMalyk

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

ritsufag ★★★★★
() автор топика
Ответ на: комментарий от ritsufag

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

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

VladimirMalyk ★★★★★
()
Ответ на: комментарий от Deleted

сформулируй «разлогиниться» в терминах авторизация и аутентификация, как ты его понимаешь

VladimirMalyk ★★★★★
()
Ответ на: комментарий от VladimirMalyk

такому сессионному йд ты можешь доверять, тк он атуентифицирован твоей подписью.

Лол.

Смотри ссылку выше, что ли.

x3al ★★★★★
()
Ответ на: комментарий от x3al

он недоумевает зачем нужен jwt, когда у него есть подписные куки.

jwt, как и подписные данные куки — «method for representing claims securely between two parties».

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

jwt же стандартизирован.

разница только в этом.

VladimirMalyk ★★★★★
()
Ответ на: комментарий от VladimirMalyk

Так, а для чего они вообще нужны тогда?
Исходя из статей в сети - одни идиоты делают с ними аутентификацию, другие идиоты прикручивают костыли в виде второго токена, дабы юзать их как сессии.
Почему практически никто не говорит о сфере их применения?

ritsufag ★★★★★
() автор топика

sign out для слабаков. Бан юзера, смена пароля

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

Deleted
()
Ответ на: комментарий от Deleted

если значение не равно тому что в базе

В чем смысл токена если нужны постоянные обращения к базе?

если значение не равно тому что в базе то все - пока

Так этим ты инвалидируешь все токены пользователя, на всех устройствах.

ritsufag ★★★★★
() автор топика
Ответ на: комментарий от ritsufag

В чем смысл токена если нужны постоянные обращения к базе?

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

на всех устройствах.

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

Deleted
()
Ответ на: комментарий от Deleted

Причем тут кеш. Тебе все равно нужно куда-то обращаться, что как бе сводит на нет все преимущества от селф контейнед токена. И да, все данные ненужны.
С таким же успехом я могу просто использовать сессии в in-memory cache, при этом я могу его так же отозвать.

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

А с сессиями такой проблемы не будет.

ritsufag ★★★★★
() автор топика
Ответ на: комментарий от ritsufag

Тебе все равно нужно куда-то обращаться, что как бе сводит на нет все преимущества от селф контейнед токена.

вообще то он не для того чтобы лентяи в базу/кеш не лазели 8)

А с сессиями такой проблемы не будет.

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

Deleted
()
Ответ на: комментарий от Deleted

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

ritsufag ★★★★★
() автор топика
Ответ на: комментарий от ritsufag

Я хочу таки выяснить в каких случаях их используют.
примеры про общение двух сервисов.

т.е. ты знаешь для чего их используют но продолжаешь хотеть это выяснить? 8)

Deleted
()
Ответ на: комментарий от ritsufag

до икспертов использующих JWT везде

о а чо в это треде есть такие? покаж ка

Deleted
()

В чем проблема не совсем понятно.

JWT можно рассматривать как некий контейнер («закодированный» при необходимости) со свойствами (расширяемыми) и в общем правильно уже сказали - стандартизирован.

Хотя, бесспорно есть избыточные вещи. Наверное в нем проще реализовать интеграцию с авторизацией различных сервис-провайдеров...

Примеров полно.

Выглядит удобным, когда необходимо общаться (сессионно) по всяким RPC/REST чем городить всякие велики.

anonymous
()

То что ты хочешь нарушает принцип stateless сервера, тебе нужны обычные сессии. Я вот сейчас делаю при каждом обращении к апи из токена достаю id, по нему вытаскиваю из базы пользователя и в зависимости от действия валидирую, в текущем проекте такой подход оправдан, обращения нечасты, лишние несколько микросекунд обращения к базе не принципиальны, зато можно выдать токен надолго, а при компроментации просто заблокировать пользователя. Можно было бы обойтись без jwt, но он есть из коробки во фреймворке, почему не воспользоваться.

ddidwyll ★★★★
()
Ответ на: комментарий от ddidwyll

бд достаточно быстра?

что правда вызов быде на соседней ноде через сеть быстрее локального словаря?

Deleted
()
Ответ на: комментарий от ddidwyll

бд локальная и вся в памяти - вполне.

воу, и часто такое у ваших веб сервисов в продакшене?

Deleted
()
Ответ на: комментарий от Deleted

Почему нет? Нужно выбирать решения наиболее подходящие ситуации, а не руководствоваться исключитльно усреднёнными правилами, я считаю.

ddidwyll ★★★★
()
Ответ на: комментарий от Deleted

Для примера два схожих сервиса в работе: серверная часть занимается хранением данных, валидацией и иногда сохранением результата вычислений, вычисления на клиенте. Пользователей 100-500, размер бд - несколько мб, в крайнем случае потеря данных за пару часов не критична. БД встроенная, ин-мемори, хранит в json, клиенты vuejs, electron, cordova. Ты конечно можешь сказать что это хипстота и ненужно, но т.к. это ПО сильно упрощает бизнес процессы компаний, просто в разработке и сопровождении, я позволю себе с тобой не согласиться :)

ddidwyll ★★★★
()
Ответ на: комментарий от Deleted

Фактически сервер и играет роль сетевой бд для клиента. Такая архитектура востребована во многих ситуациях.

ddidwyll ★★★★
()
Ответ на: комментарий от Deleted

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

ddidwyll ★★★★
()
Ответ на: комментарий от ddidwyll

Пфф, нечего сказать?

мнеж придется опуститься до твоего уровня где ты уже задавишь своим опытом

Deleted
()
Ответ на: комментарий от Deleted

если он не знает про кеш?

И мы снова пришли к вопросу «как разлогинить пользователя, если в кэше он залогинен»!

x3al ★★★★★
()
Ответ на: комментарий от Deleted

В условиях распределённости это может стать нетривиальным. Никто не гарантирует, что связь между датацентрами стабильна.

x3al ★★★★★
()
Ответ на: комментарий от x3al

В условиях распределённости ... Никто не гарантирует, что связь между датацентрами стабильна.

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

ps. ребята которые варят такую кухню не будут спрашивать на форуме зачем нужен JWT и т.п. потому разберутся сами

Deleted
()

Именно все так и есть. Я сам из приложения выпилил почти всю функциональность с токенами и рефреш-токенами (не я ее реализовывал), использую только для гоняния «горячей» информации, а именно роли, айди и другой хрени, которая не меняется. Дело в том, что в моем приложении необходима возможность немедленно деактивировать или удалить юзера. Я не стал ничего изобретать и просто на каждый запрос (да, это спа приложение) выбираю юзера с датабазы и смотрю не удален или деактивирован он. Конечно, выходит так, что пока страница загрузится, юзер проверится раз 15, но пока проблем не создает.

nikolnik ★★★
()
Ответ на: комментарий от nikolnik

Можно не проверять всякий раз в БД, а просто записать в сессионный файл признак один раз, потом проверять при каждом обращении.

anonymous
()
Ответ на: комментарий от VladimirMalyk

селфконтейнед
ишьюить
Офкорс

Вы серьёзно?

Dron ★★★★★
()
Ответ на: комментарий от ritsufag

за пределами браузерного мира куки создают больше проблем, чем решают.

если это какойнить вордпрес с лапшой на жквери — тут можно положиться на пхп-шную и браузерную магию поверх кук.

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

VladimirMalyk ★★★★★
()
Ответ на: комментарий от nikolnik

на точке входа HTTP запроса один раз по токену запрашивается юзер и прикрепляется к запросу, все, больше лезть за юзером в базу не требуется

но я понимаю что «у нас не так», «тут все сложнее» и «в реальном мире это не работает» - т.к. по опыту знаю такие банальные вещи не постижимы для рядовых девелоперов

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.