более, так то нест наше всё, разумеется), тайпорм, постгрес. Делаю создание нового юзера и тут возник вопрос... а как подтверждение аккаутна делать?
Например я хочу сделать подтверждение акка через тг бота, почту, matrix.org бота, ну и потом мб в OAuth2 научусь и сделаю гугл, гитхаб и т.д. Только вот я пока вообще хз как это должно работать.
Я предпологаю что как то так на примере ТГ бота:
Приходит запрос от юзера: креды для регистрации, тип подтверждения акка, и т.д.
Парсим этот запрос, пихаем в какой нибудь кэш, доступный так же тг боту. Юзера редиректит на какое-нибудь verifyTg где ему выдаёт код который он должен отправить боту и если он всё отправляет успешно, то акк зареган, а юзеру приходит response о том то что акк зареган и следом выдаёт куки через какие нибудь веб сокеты.
В случае почты генерируется токен и отправляется на почту в виде ссылки. С тг думаю все так же
Да, в тг можно реферальную ссылку сделать в теоррии
Понял, спасибо, а есть примеры кода на гитхабе?
У меня нет примера. Работает примерно так: 1 - генерируется токен и сохраняется в какое нибудь хранилище вместе с userId, с ттл если надо 2 - формируется ссылка с токеном test.dev/confirm/{token} и отправляется на почту 3 - в контроллере по токену достается юзер и помечается как подтвержденный
Понял, спасибо!
Хммм... а можно как то неподтверждённого юзера удалять спустя какое то время? Например 1 час без подтверждения и юзера нет.
В теоррии можно просто при создение юзера можно с setTimeout() вызывать функцию что чекает подтверждён ли юзер кстати, если нет, то делитает его. Но оно ж память будет жрать наверн
Можно сделать какой нибудь хроно который раз в день мроходится по базе и удаляет неподтвержденных
у неста есть @nestjs/schedule
Норм вариант, не будет жрать память. В nest есть планировщик задач, под капотом нативный setTimeout
если используется редис в приложении, то токен можно хранить в нём и установить время жизни
понял, спасибо, тоже вариант. Тогда можно вообще сразу неподтвержденного юзера в кэш писать, а потом только в базу кидать после подтверждения
Редис не очень надёжное решение. Это будет работать до тех пор пока редис не ляжет.
так а с чего ему ложиться то?
как и любая база. Ляжет пострес и он уже не работает, лол)
Иногда так случается. Причина может быть любой. Кто-то его перезапустил например.
у меня всё в докере
переподниматься только ночью будет для обнов, когда это не столь важно
Ну юзера лучше в бд хранить, это ценные данные, даже если он не закончил регистрацию. Редис только для этого токена я бы не поднимал и планировщик тоже. Сделал бы отдельную таблицу с 'userId | token | expiresAt'. Очищал бы раз в год и старые токены при добавлении нового токена юзера. Ну или хранил бы токен прям в таблице юзера
Обсуждают сегодня