Управление несколькими провайдерами OAuth в Django/DRF

Допустим, у меня есть два OAuth-провайдера, Google и GitHub, с помощью которых пользователь может создать аккаунт в моем Django-приложении. Я написал пользовательскую модель пользователя и пользовательскую модель для хранения деталей OAuth (провайдер, идентификатор пользователя от провайдера и т.д.).

Допустим, пользователь сначала входит в GitHub и создает учетную запись. Он выходит из системы, регистрируется снова, но на этот раз с помощью Google.

Теперь что происходит? Как я могу узнать, что у пользователя уже есть учетная запись, связанная с GitHub? Я не могу проверить электронную почту, потому что для разных платформ она может быть разной. Я также не могу использовать ID пользователя из OAuth-провайдера.

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

По моему опыту, при внедрении OAuth мы всегда выбирали email в качестве уникального идентификатора пользователя, поскольку пользователи обычно пытаются использовать один и тот же email. Когда это было не так, мы создавали новый профиль.

Без подобного идентификатора невозможно определить, зарегистрирован ли уже пользователь. Это может быть комбинация имени и фамилии или адрес электронной почты. Выбор за вами.

Но есть способы справиться с этой проблемой без создания новых профилей. Можно добавить пользовательскую логику, которая спрашивает пользователя Do you already have a profile? перед завершением регистрации. Если ответ положительный, это письмо можно добавить, например, в таблицу M2M, которая связывает пользователей и электронные адреса с источником OAuth. Или можно сделать функцию слияния профилей, если пользователь захочет это сделать. Но я уверен, что есть и другие способы добиться этого. Это лишь то, что первым приходит мне в голову.

Вернуться на верх