В настоящее время я разрабатываю систему аутентификации с Firebase.Я хотел бы, чтобы моя система принимала электронную почту / пароль, Google и Facebook в качестве методов регистрации и входа.
Пока все хорошо.Все работает хорошо, когда пользователь подписывается на каждый метод отдельно.Проблема начинается, когда пользователь хочет зарегистрироваться другим методом, и мне нужно связать новый метод с той же учетной записью, которая была ранее зарегистрирована этим же пользователем другим методом.
В моих примерах будет упоминаться только электронная почта /пароль и методы Google.
Примечание. Моя система аутентификации Firebase настроена на прием только 1 учетной записи на одно письмо.
Example1 (работает нормально):
- Пользователь впервые регистрируется в Google
- Отлично!Я получаю его данные и записываю их в Firestore, используя ID пользователя, созданный системой аутентификации.
- Пользователь пытается зарегистрироваться снова, теперь используя свой адрес электронной почты / пароль (тот же адрес электронной почты, что и в 1-м регистре в Google)
- Я получаю сообщение об ошибке, сообщающее, что электронная почта используется, я сообщаю пользователю, что он уже зарегистрирован в Google, и я прошу его снова войти в систему с помощью Google
- Затем, как только он вошел в систему.с помощью Google я позволю ему создать пароль на странице своего аккаунта.
- Я возьму этот пароль и свяжу его с ранее существовавшим аккаунтом (в котором он в настоящее время зарегистрирован), который был создан при его первой подписке.с Google.
- Отлично!Теперь у меня есть пользователь, который может войти в систему с помощью Google или его пароля.
Пример 2 (проблема):
- Пользователь регистрируется длявпервые используя свой адрес электронной почты / пароль.Обратите внимание, что его электронная почта от Google (gmail).
- Отлично!Я получаю его данные и записываю его в Firestore, используя ID пользователя, созданный системой авторизации.
- Пользователь пытается зарегистрироваться снова, теперь используя метод входа в Google (с тем же адресом электронной почты).
- Видимо, все работает хорошо, и пользователь входит в систему просто отлично.
- Но факт в том, что без каких-либо предупреждений аутентификация Firebase отбросила его метод электронной почты / пароля и заменила его только методом входа в Google.
Группа Google - Firebase Talk - Об этой проблеме
Из приведенной выше ссылки и некоторых других связанных с этим вопросов здесь, в StackOverflow, я понял, что такое поведение выглядит следующим образомиз-за проблем безопасности, и именно поэтому Google имеет «более высокий приоритет» по сравнению с другими поставщиками аутентификации, поскольку вы действительно можете доверять этим пользователям и их электронным письмам.
Но удалять созданный пользователем пароль кажется неправильныммне.Не говоря уже о том, что вы делаете это без каких-либо предупреждений.
А также, похоже, это противоречит следующей странице справки Firebase:
Справка Firebase - разрешить нескольким учетным записям использовать один и тот же адрес электронной почтыадрес
На странице справки, указанной выше:
Вы можете настроить, могут ли пользователи создавать несколько учетных записей, которые используют один и тот же адрес электронной почты, но связаны с другим входом в систему.методы.Например, если вы не разрешаете использование нескольких учетных записей с одним и тем же адресом электронной почты, пользователь не может создать новую учетную запись, которая выполняет вход с использованием учетной записи Google с адресом электронной почты ex@gmail.com, если уже существует учетная запись, которая выполняет вход с использованиемадрес электронной почты ex@gmail.com и пароль.
Из приведенного выше отрывка я понимаю, что не могу создать учетную запись с помощью Google, если я создал ее ранееиспользуя комбинацию электронной почты и пароля.Но это не то, что происходит, как в Примере 2. Очень странно!
Теперь реальный вопрос:
Поскольку я не смогу изменить поведение Firebase, я подумываю об изменении моей системы аутентификации Firebase, чтобы разрешить использование нескольких учетных записей для одной электронной почты и обрабатывать все данные моих пользователей в Firestore, используя их электронную почту в качестве первичного ключа (вместо использованияuserID системы аутентификации Firebase), поскольку каждая комбинация метода электронной почты / входа будет считаться отдельной учетной записью в системе аутентификации Firebase и, следовательно, у каждой будет свой идентификатор пользователя.
Пример:
johndoe@gmail.com / password = идентификатор пользователя X
johndoe@gmail.com / вход в Google = идентификатор пользователя Y
johndoe@gmail.com / вход в Facebook =UserID Z
Все вышеперечисленные учетные записи будут хранить и получать доступ к данным в Firestore, используя johndoe@gmail.com в качестве «первичного ключа» (коллекция).
Но так как яна ранних этапах моего развития это кажется немного «хакерским», и я могу столкнуться с некоторыми осложнениями в будущем.
Что вы рекомендуете?Основная цель здесь - позволить моим пользователям зарегистрироваться и войти, используя любой метод , какой они захотят.Все методы должны позволять им получать доступ к своим данным в моем приложении (которое будет в Firestore).
Я отказываюсь молча удалять ранее созданный им пароль пользователя, чтобы позволить им зарегистрироваться и войти в Google.
Есть еще идеи или комментарии?
Извините за длинный вопрос, но я думаю, что он хорошо проиллюстрировал проблему.