LINUX.ORG.RU

Регистрация юзеров логика

 , , ,


0

1

Есть несколько endpoint’ов. Auth, end1, end2. На auth регистрация юзера производится по user password, на end1 и end2 регистрация юзера производится по информации, которая находится внутри токена(внутри токена id, который отдал Auth после регистрации), чтобы id’шки на всех endpoint’ах совпадали. Сижу и думаю, как это всё правильно оформить. Итак, у нас есть мобильная аплека, которая регистрирует пользователя. Юзер ввел код, который прилетел ему от firebase и далее варианты развития событий

  1. в апи Auth я добавляю код, который сначала создает юзера в Auth, потом идет на end1/register, создаёт юзера там, получает ответ 200, что всё ок, далее идет на end2/register, создает юзера и получает 200. Когда получил 200 от end1 & end2, отдаёт «ОК» клиенту. Тупой вариант. Почему? end1 и end2 могут не быть не в рабочем состоянии и получается так, что мы УЖЕ создали юзера в Auth(потому что без создания юзера мы не сможем отправить id в end1 & end2) и если end1 и/или end2 не работают, то мы получим отлуп клиенту при созданном юзере в Auth

  2. юзер стучится в Auth, ему возвращается 200(ОК). Это считается завершением регистрации. Далее понятия не имею как правильно. Скорей всего нужно где-то в базе сделать поля end1_reg: False, end2_reg: False. Далее, при обращении к этому endpoint’у юзер смотрит на флаг end1_reg, если он False - обращается на end1/register, пока end1 не вернет 200 и флаг не станет True, а уже после этого начинает отправлять в end1 запросы в апи. Или сразу же после регистрации в Auth в фоне начинает стучаться на end1/register,end2/register, пока ему не вернется оттуда 200(ОК)

Как вообще правильно сделать?

★★★

Последнее исправление: serg002 (всего исправлений: 3)

Может стоит кинуть сообщение в кролика/кафку о регистрации пользователя?

А зачем вообще что-то сообщать end1, end2?

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

А зачем вообще что-то сообщать end1, end2?

Не понял этого сообщения

Может стоит кинуть сообщение в кролика/кафку о регистрации пользователя?

Ты предлагаешь использовать сервер событий? Хорошо, я отправляю сообщение серверу событий. Он подхватывает таски и выполняет api end1/register и end2/register

  1. если сервер событий потерял задание, тогда что?
  2. если до сервера событий не долетели таски? Выключен был или упал или еще что-то. Тогда что?
serg002 ★★★
() автор топика

Как вообще правильно сделать?

Почитать что-то про oauth или ещё что-то похожее, когда end1 и end2 не знают ничего про юзера, но знают про сервер Auth, который про юзера знает всё.

vvn_black ★★★★★
()

Думаю, может вообще не париться, просто шлешь апи, если отвечает «юзера нет», то делать запрос на endX/register и всё. Нигде не хранить никаких состояний о том, прошла ли рега или не прошла на endX

serg002 ★★★
() автор топика
Ответ на: комментарий от ya-betmen

на endX доступ к апи производится по jwt. Юзер передает информацию в апи, апи распаковывает jwt и пишет информацию в таблицы, привязывая информацию к юзеру. Чтобы привязать информацию к юзеру, его сначала нужно создать на endX. Не буду же я в каждом апи перед записью проверять есть ли юзер или нет и создавать его при отсутствии. Реально нужно один раз создать юзера в endX и всё. Вопрос топика, как это правильно сделать

serg002 ★★★
() автор топика
Последнее исправление: serg002 (всего исправлений: 1)
Ответ на: комментарий от serg002

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

Ты сказал что тебе нужно чтобы id юзера совпадали, для чего тебе юзер целиком на endX? Это и странно и противоречит логике микросервисов.

ya-betmen ★★★★★
()
Ответ на: комментарий от serg002

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

Правильно, за тебя это сделает БД.

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

Да, ты совершенно прав. Делаю небольшой проект. Который врядли будет давать доход. Пилю его по фану. Если кто-то будет пользоваться этим проектом кроме меня - буду бесконечно рад

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

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

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

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

Как они будут синкаться?

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

Зачем, когда есть UPSERT или INSERT ON CONFLICT. Просто пишешь данные из JWT в БД и задаёшь логику, что делать если нарушена уникальность ключей.

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

смотри, тут есть два варианта развития событий:

  1. создать таблицу, в которой id юзера просто будет лежать как id. Тогда апи распаковывает jwt, далее берет id юзера и просто пишет данные в таблицу, заполняя поле id
  2. в django создается юзер, и при записи в бд в запросе указывается юзер

Второй вариант - это, как мне кажется, django-way. Поэтому требуется на endX создавать юзера. Вот об этом и создан топик

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

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

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

Или сделай им общую базу(плохой подход) Плохой подход, сразу нет

или пусть один твой сервис периодически ходит в другой и забирает нужные данные(хороший подход)

Это на auth нужно создавать таблицу, в которой нужно хранить таски для endX. Это такой сервер ивентов в миниатюре. Периодически если будут ходить endX в auth - они будут создавать на него нагрузку т.к нужно очень часто проверять таск на создания юзера, потому как если это делать редко, тогда аплека будет стучаться в endX, на котором не зареган юзер

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

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

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

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

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

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

Так сходи в auth сервис и создай юзера если его ещё нет в endx если тебе обязательно нужно иметь там юзера.

Второй вариант - это, как мне кажется, django-way.

Но это не микросервис-вей.

ya-betmen ★★★★★
()
Ответ на: комментарий от Aswed

если так делают «все», тем более в энтерпрайзе, это не значит, что это хорошие подходы.

аргументируй чем плох подход с одной общей бд?

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

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

pavkazzz
()
Ответ на: комментарий от deep-purple

Потому что это подход монолита, а не микросервисов. Это не плохой подход, но он не про микросервисы

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

Я спрашивал не у тебя, и pavkazzz не у тебя.

Да и хрен с ним.

Подумайте на досуге над тем, чем является репликация БД — монолитом или микросервисами? В этих вот самых смузихлёбских терминах. А затем подумайте над всем этим адом из жвт-говна и кроликов, которое вы энтерпрайзненько наворачиваете каждый раз в проектах — стильно, модно, молодёжно.

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

Я понял о чём ты. Ты и прав и не прав одновременно. Всё зависит от потребностей и возможностей

serg002 ★★★
() автор топика
Ответ на: комментарий от deep-purple

Если ты настолько ленив, что не можешь нагуглить сам то, о чем «все» говорят на каждом техническом форуме как минимум последние три года, то вот:

  1. Растет нагрузка на базу и она становится бутылочным горлышком т.к. база одна и все сервисы в нее ходят
  2. Проблема безопасности. В случае раздельных баз ты можешь условно сделать маленький сервис аутентификации и полностью проверить его на безопасность. При этом взлом какого-нибудь полуненужного сервиса для покраски штанов приводит лишь к утечке данных по покраске штанов. Если же у тебя монолит, то взлом полуненужного сервиса приведет к утечке всей базы.
Aswed ★★★★★
()
Ответ на: комментарий от Aswed

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

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

Каждый подход, будь то монолит или микросервисы имеют свои приемущества и недостатки. Попробуй создать тему «монолит vs микросервисы» и попробуй там изложить все свои мысли. От себя могу сказать, что я за монолиты когда это возможно. Но это возможно не всегда

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

Нет.

Так и отдельные части одного приложения можно посчитать за микросервисы. Прямо в коде посмотри, раскинь мозгами. Т.е. ты того не подозревая всегда «микросервисы» пишешь.

Меня же просто выворачивает вот эта говномода когда куча железок и приложений по факту только запутывают и удорожают схему работы комплекса. Эти сраные модные смузихлебы KISS хоронят!

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

deep-purple ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.