Firebase великолепен, так как предлагает множество провайдеров аутентификации. В одном из моих приложений я использую четыре разных провайдера, предоставляемых Firebase (электронная почта, Twitter, Facebook и Google), но мне также нужно разрешить пользователям входить через LinkedIn.
Поскольку Firebase SDK не предлагает LinkedIn, Мне нужно реализовать поток входа вручную, что не кажется сложным, но есть одна огромная проблема, которую я вижу. При создании пользовательского токена JWT мне нужно назначить идентификатор пользователя. И я понятия не имею, как его сгенерировать, убедившись, что мой подход не будет конфликтовать с идентификаторами пользователей, которые Firebase генерирует самостоятельно для других провайдеров.
Например, давайте представим, что пользователь Андрей Гордийчук регистрируется через LinkedIn и его адрес электронной почты andriy@gordiychuk.com. Простой способ создать идентификатор пользователя - взять адрес электронной почты (andriy@gordiychuk.com
) и рандомизировать его, используя некоторую функцию хеширования. Я получил бы некоторый случайный идентификатор, такой как aN59nlphs...
, который я мог бы воссоздать, пока один и тот же пользователь входит в систему. Пока все хорошо.
Однако, как я могу быть уверен, что идентификатор, который Я получаю, что еще не используется другим пользователем, который вошел в систему через Twitter, например?
Один из способов решить эту проблему - сохранить идентификаторы пользователей LinkedIn в коллекции Firestore. Затем, когда мне нужно создать токен, я сначала проверяю, есть ли у меня идентификатор для этого пользователя. Если нет, у меня был бы sh адрес электронной почты, и я бы попытался создать пользователя с этим идентификатором. Если этот идентификатор уже занят, я попытался бы создать другой идентификатор, пока не наткнулся на идентификатор, который не занят, и затем использовал бы его.
Мне не нравится этот подход по двум причинам:
- Хотя вероятность того, что я сгенерирую уже занятый идентификатор, невелика, теоретически процесс поиска «доступного идентификатора» может состоять из множества шагов (бесконечно l oop в худшем случае). сценарий).
- Как только я найду доступный идентификатор, я должен сохранить его. Учитывая, что все эти вызовы являются асинхронными, существует реальная вероятность того, что я создам пользователя с подходящим идентификатором, но поскольку операция сохранения не удалась, я не смог бы использовать этот идентификатор.
Итак Кто-нибудь знает, как правильно выбрать идентификаторы пользователя для такого варианта использования?