Оптимальный способ идентификации пользователя через авторизацию в социальных сетях
На данный момент идентификация авторизованного пользователя через социальные сети работает следующим образом. Из социальной сети берется почтовый адрес, потом сверяется в таблице, если есть совпадение, значит вход в этот аккаунт, в противном случае, создаётся новый аккаунт с этой почтой. Но в связи с этим есть достаточно важные потенциальные проблемы.
Первая проблема: если пользователь Facebook изменит почту, то при логине, он попадет в новый аккаунт, а не в свой старый, так как почты не будет в БД.
Вторая проблема: некоторые социальные сети не выдают вообще почту, такая как Твиттер, к примеру, или Фейсбук если регистрация через мобильный телефон. А заставлять клиента при входе делать проверку и вводить почтовый адрес, если внешний провайдер не предоставил, не очень хочется.
После множества статей, так и не понял какой способ самый оптимальный и лучший.
Есть на данный момент такой вариант возможной реализации: полностью отвязаться от социальной почты и не использовать ее. А делать привязку только по ID пользователя из социальной сети. Если в моей таблице нет пользователя с таким социальным ID и этот ID не привязан к какому-то существующему аккаунту, как допольнительный способ входа - новый пользователь.
То бишь, оставить такие способы регистрации/входа:
- Через почту/пароль
- Входы через внешних провайдеров
И в дополнении, после входа в систему, в настройках аккаунта, пользователь может привязать ID социальной сети (хоть всех сразу). И если пользователя с таким социальным ID ещё нет в базе и он ещё нигде не привязан, значит он привязывается к текущему аккаунту (который может быть создан через почту/пароль, или другой социальный провайдер, не важно). И пользователь может входить в этот же аккаунт несколькими способами (в зависимости, какие способы он привязал, включая почту/пароль, если отдельно почту привязал).
Такая реализация хорошая или имеет подводные камни?
Большой плюс в том, что по сути при социальных логинах совсем не нужен будет email, только ID для идентификации. И не важно, даст ли социалка почту или нет, сменит почтовый адрес или нет, тоже это уже не моя проблема будет, ведь ID не меняется никогда. А если пользователь к своему аккаунту захочет привязать почту/пароль, как дополнительный вход, то ему придется ввести уникальную почту, даже если Гугл/Фейсбук ее предоставил (так как в этом способе почты от социалок игнорируются).
Пример этой реализации:
Пользователь первый раз зашёл через Google (зарегистрировался).
Потом есть несколько вариантов событий:
- Если пользователь зайдет дальше из Фейсбука, то это будет новый аккаунт, даже если почта совпадает с почтой Гугла (так как нет привязки по почте).
- Если до первого входа через ФБ, сделает в профиле текущего аккаунта привязку к Фейсбук, то после дальнейшего входа через Фейсбук будет попадать в текущий аккаунт, в котором выполнил эту привязку, а не в новый, несмотря на почту и все такое.
- Если игрок потом добавит способ входа "почта/пароль", то будет попадать через указанную почту/пароль в этот же аккаунт.
Это хороший способ реализации или всё-таки первый, который с простой привязкой по почте, лучше?