Управление несколькими провайдерами OAuth в Django/DRF
Допустим, у меня есть два OAuth-провайдера, Google и GitHub, с помощью которых пользователь может создать аккаунт в моем Django-приложении. Я написал пользовательскую модель пользователя и пользовательскую модель для хранения деталей OAuth (провайдер, идентификатор пользователя от провайдера и т.д.).
Допустим, пользователь сначала входит в GitHub и создает учетную запись. Он выходит из системы, регистрируется снова, но на этот раз с помощью Google.
Теперь что происходит? Как я могу узнать, что у пользователя уже есть учетная запись, связанная с GitHub? Я не могу проверить электронную почту, потому что для разных платформ она может быть разной. Я также не могу использовать ID пользователя из OAuth-провайдера.
Пожалуйста, не просите меня использовать библиотеки, я готов научиться реализовывать это самостоятельно.
По моему опыту, при внедрении OAuth мы всегда выбирали email в качестве уникального идентификатора пользователя, поскольку пользователи обычно пытаются использовать один и тот же email. Когда это было не так, мы создавали новый профиль.
Без подобного идентификатора невозможно определить, зарегистрирован ли уже пользователь. Это может быть комбинация имени и фамилии или адрес электронной почты. Выбор за вами.
Но есть способы справиться с этой проблемой без создания новых профилей. Можно добавить пользовательскую логику, которая спрашивает пользователя Do you already have a profile?
перед завершением регистрации. Если ответ положительный, это письмо можно добавить, например, в таблицу M2M, которая связывает пользователей и электронные адреса с источником OAuth. Или можно сделать функцию слияния профилей, если пользователь захочет это сделать. Но я уверен, что есть и другие способы добиться этого. Это лишь то, что первым приходит мне в голову.