Я, кстати, считаю, что сегодня руками делать пользовательскую авторизацию, включая OAuth, восстановление паролей, 2FA и вот это вот всё - уже плохая идея. Тонкостей много, работы много, вероятность профачить что-то критическое - неприемлемая. Можно написать книгу, как оказывается.
Поэтому есть деньги - покупаем готовое из того, что точно останется в проекте навсегда, т.е. vendor lock is not an issue: Firebase, Cognito, Azure AD, Cloud identity. Параноим насчёт vendor lock - берем Auth0 или Okta. Нет денег - берём опенсорс и доводим напильником: Keycloak, Ory, Passport.Js, OmniAuth.
Change my mind!
Согласен кстати. Использую на разных проектах Auth0, Okta, Azure AD, Keycloak и Ory.