170 похожих чатов

Всем привет! Есть такая проблема. NestJS используется в качестве BFF прокси

прослойки. Фронт авторизуется через BFF и держит авторизацию через сессию (express-session + connect-redis). JWT токен хранится на стороне BFF в сессии. Кроме access токена хранится ещё refresh token. И вот проблема в реализации нормального рефреша. Пользователь открывает страницу, сразу отправляется пачка параллельных запросов за всякими данными, словарями и прочим. Я в guard'е проверяю не истёк ли токен, и если истёк, то отправляю запрос на refresh и обновляю в сессии access token. Но когда запросов много одновременно, то в итоге формируется целая пачка access токенов. Пытался синхронизировать через redis. Типа записывать в сессию флаг о том, что выполняется рефреш токена. В созданный для этого канал пушится сообщение о начале рефреша. При этом подписанные к этому каналу на это событие подгружают актуальную сессию через req.session.reload(). Но это не работает, всё равно успевают создаться несколько сессий.

Собственно вопрос какие есть способы добиться, чтобы в один момент времени какое-то событие произошло только один раз при нескольких параллельных запросах в, например, 2 одновременно запущенных подах с NestJS? Были мысли сделать это через очередь. Но боюсь, что проблема будет той же - запросы на рефреш отправятся раньше, чем станет известно, что параллельно он уже выполняется.

13 ответов

24 просмотра

Кажется, что проблему надо решать на фронте. Так как пачка одинаковых запросов - это неправильно

Vladimir- Автор вопроса
Алексей Попов
Кажется, что проблему надо решать на фронте. Так к...

Запросы то разные, просто отправляются одновременно при загрузке страницы.

Vladimir- Автор вопроса
Алексей Попов
Кажется, что проблему надо решать на фронте. Так к...

Запросы всяких списков, справочников типа /currencies, /countries, /some-list

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

Vladimir- Автор вопроса
John Doe
Касательно того, как сделать так, чтобы только оди...

Да, похоже, но здесь сработает, если нода запущена одна. А у нас запускается параллельно два пода с приложением. С таким вариантом просто отправится не более 2 запросов. Что уже лучше, конечно. Но не полностью решит ситуацию.

Vladimir
Да, похоже, но здесь сработает, если нода запущена...

Тогда если нужен один access на все иснтансы, то пусть инстаны ноды лезут в общее хранилище (например redis) и получаю токен оттуда. А в редис его будет класть другой бекграунд процесс раз в N времени

Vladimir- Автор вопроса
Vladimir
Он и лежит в redis - в сессии

Пусть его кладёт один бекграунд процесс раз в N времени. А не так, что каждый инстанс пытался бы договориться с другими, кто же его туда положит

Vladimir- Автор вопроса
John Doe
Пусть его кладёт один бекграунд процесс раз в N вр...

Да я вот уже думаю о том, чтобы просто автоматически рефрешить эти токены по крону... Это будет примерно тоже самое, тоже обновляться раз в N времени.

Vladimir
Да я вот уже думаю о том, чтобы просто автоматичес...

Я думаю мы тогда говорим об одном и том же

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

Vladimir
Да я вот уже думаю о том, чтобы просто автоматичес...

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

Vladimir- Автор вопроса
Алексей Попов
А почему не работает синк через редис? При правиль...

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

Похожие вопросы

Обсуждают сегодня

Мужики и девушки, привет) в Вelphi xe7 в настройках во вкладке "Editor Options" далее " Color" есть список: "Elements", открыв который мы можем настраивать отображение разных...
Kraszx
14
Добрый вечер. Есть вопрос, а может и предложение. Был у меня диалог в другой группе о делфи и я задался вопросом: "А нельзя ли в делфи цвет //коментария и {комментария} сде...
Kraszx
24
Я вот подумал. SSE выполняет операции максимум с 64-битной точностью. А FPU - всегда с 80-битной. Разве не должно быть FPU точнее тогда?
The Bird of Hermes
13
как быть с принтером? такой подход прокатит?
zamtmn
12
Мдя, прикол, боевая сборка запускается (именно под отладчиком) после F9 примерно полторы минуты (97 секунд если быть точным). Начал копать - проблема детектится сразу - зависа...
Александр (Rouse_) Багель
38
Всем привет! Подскажи, пожалуйста, как передать в TComboBox сразу значение и id записи. На Delphi я делал так: ComboBox1.Items.AddObject('Какое-то значение', Pointer(id запис...
Евгений
13
Я не понимаю, это троллинг или что? Швабрика поддерживают, который буквально пишет на ассемблере взаимодействия с винапи. Я это ещё написал загрузчик и хоть что-то изучаю в о...
Shadow Akira
6
Здравствуйте, вопрос по структурам данных. Были у вас случаи, когда пришлось писать деревья или двунаправленные списки?
/ /
50
А вот это что за конструкция? Вернее, она тут нафига?
Serjone
10
Привет. Подскажите, как правильно сматчить лист фиксированного размера, чтобы компилятор не говорил мне о неполном паттерне? Допустим что-то такое [x', y'] = sort [x, y]?
Arseny
8
Карта сайта