Firebase пользовательская аутентификация, как выбрать уникальный идентификатор пользователя? - PullRequest
0 голосов
/ 06 апреля 2020

Firebase великолепен, так как предлагает множество провайдеров аутентификации. В одном из моих приложений я использую четыре разных провайдера, предоставляемых Firebase (электронная почта, Twitter, Facebook и Google), но мне также нужно разрешить пользователям входить через LinkedIn.

Поскольку Firebase SDK не предлагает LinkedIn, Мне нужно реализовать поток входа вручную, что не кажется сложным, но есть одна огромная проблема, которую я вижу. При создании пользовательского токена JWT мне нужно назначить идентификатор пользователя. И я понятия не имею, как его сгенерировать, убедившись, что мой подход не будет конфликтовать с идентификаторами пользователей, которые Firebase генерирует самостоятельно для других провайдеров.

Например, давайте представим, что пользователь Андрей Гордийчук регистрируется через LinkedIn и его адрес электронной почты andriy@gordiychuk.com. Простой способ создать идентификатор пользователя - взять адрес электронной почты (andriy@gordiychuk.com) и рандомизировать его, используя некоторую функцию хеширования. Я получил бы некоторый случайный идентификатор, такой как aN59nlphs..., который я мог бы воссоздать, пока один и тот же пользователь входит в систему. Пока все хорошо.

Однако, как я могу быть уверен, что идентификатор, который Я получаю, что еще не используется другим пользователем, который вошел в систему через Twitter, например?

Один из способов решить эту проблему - сохранить идентификаторы пользователей LinkedIn в коллекции Firestore. Затем, когда мне нужно создать токен, я сначала проверяю, есть ли у меня идентификатор для этого пользователя. Если нет, у меня был бы sh адрес электронной почты, и я бы попытался создать пользователя с этим идентификатором. Если этот идентификатор уже занят, я попытался бы создать другой идентификатор, пока не наткнулся на идентификатор, который не занят, и затем использовал бы его.

Мне не нравится этот подход по двум причинам:

  1. Хотя вероятность того, что я сгенерирую уже занятый идентификатор, невелика, теоретически процесс поиска «доступного идентификатора» может состоять из множества шагов (бесконечно l oop в худшем случае). сценарий).
  2. Как только я найду доступный идентификатор, я должен сохранить его. Учитывая, что все эти вызовы являются асинхронными, существует реальная вероятность того, что я создам пользователя с подходящим идентификатором, но поскольку операция сохранения не удалась, я не смог бы использовать этот идентификатор.

Итак Кто-нибудь знает, как правильно выбрать идентификаторы пользователя для такого варианта использования?

1 Ответ

1 голос
/ 06 апреля 2020

Довольно часто генерируется строка с достаточной энтропией (случайностью), чтобы статистически гарантировать, что она никогда не будет дублирована. Это, например, позади генераторов UUID, которые существуют на многих платформах, и аналогично позади ключей pu sh базы данных Firebase Realtime и ключей add() Cloud Firestore. Если в вашей платформе есть такой, я рекомендую начать с него.

Также см .:

...