Я прочитал, что с помощью Firebase я могу разрешить пользователям входить в мое приложение с использованием нескольких поставщиков аутентификации, связав учетные данные поставщика аутентификации с существующей учетной записью пользователя. Можно ли связать настраиваемого поставщика аутентификации, такого как Linkedin? Я прочитал, что мне нужно передать объект AuthCredential в метод linkWithCredential вошедшего в систему пользователя, но я не нашел настраиваемого AuthCredential.
Связывание настраиваемого поставщика аутентификации с Firebase
Ответы (2)
Один из способов связать нестандартный токен неподдерживаемого поставщика с существующей учетной записью - получить идентификатор пользователя учетной записи Firebase и идентификатор пользователя неподдерживаемого поставщика и сохранить хэш-карту, которая принимает неподдерживаемый идентификатор поставщика и возвращает uid firebase, с которым вы хотите связать . Когда пользователь входит в неподдерживаемый поставщик с настраиваемым токеном, вы получаете соответствующий uid firebase с карты и возвращаете настраиваемый токен с этим uid, который в signInWithCustomToken разрешается с исходным пользователем firebase.
Обратной стороной является то, что вы не видите неподдерживаемого поставщика в списке данных поставщика внутри пользователя. Также вам необходимо сохранить карту.
signInWithCustomToken( newToken ). Эти два пользователя объединились.
- person beytarovski; 27.07.2017
Я хотел бы расширить ответ bojeil.
Существует firebaseUser.linkWithCredential(credential) для поддерживаемых поставщиков, но не эквивалент для customProvider. Связывание customProvider должно выполняться бэкэнд (или, может быть, что-то вроде функций Firebase). Потому что link означает одно из следующих:
- добавить электронную почту
- Добавьте номер телефона
- настраиваемая логика (добавить заявку пользователя)
объекту Firebase User.
Flow выглядит так:
- Клиент получает
email,phoneили некоторую уникальную информацию от customProvider (Line, LinkedIn, Huawei ...) и отправляет их в Backend, включаяfirebaseToken. - (Backend может проверить эти данные, запросив customProvider). Затем Backend добавляет эту информацию к объекту
FirebaseUser. (Также серверная часть должна проверить, не прикреплены ли эти данные к какому-то другому пользователю. Вы можете отклонить ссылку, поскольку уже есть другой пользователь с этим адресом электронной почты, телефоном ...) - Бэкэнд где-то сохраняет
<CustomProviderId-FirebaseUserId>пару (например:FireStore). Это сделано потому, что в будущем, когда пользователь захочет войти в систему с помощью customProvider, серверные части должны будут создатьCustomToken(чтобы клиент мог вызыватьfirebaseAuth.signInWithCustomToken), используяFirebase Idэтого пользователя. Итак, это отображение - решение этой проблемы. - Серверная часть ответит кодом ответа HTTP 200, чтобы указать, что связывание прошло успешно.
- Клиент звонит
firebaseUser.reload(), чтобы получить новые прикрепленные данные (электронная почта, телефон и т. Д.) - Если утверждения пользователей обновляются на шаге 2, клиент также должен вызвать
firebaseUser.getIdToken(force=true), чтобы получить обновленные утверждения пользователей.
Есть проблемы:
- Если customProvider выдает только
email, вам нужно проверить, прикреплен ли этот адрес электронной почты к любому другому пользователю. - Если customProvider выдает только
phone, вам нужно проверить, подключен ли этот телефон к любому другому пользователю. - Если customProvider может выдавать и
email, иphone, сложность возрастает, так как вам нужно проверить, не привязаны ли какие-либо из них к любому другому пользователю. - Если customProvider не предоставляет
emailилиphone, тогда вам нужна уникальная информация для этого пользователя для этого настраиваемого поставщика (например, идентификатор пользователя Huawei). - CustomProvider не будет в списке
firebaseUser.providerData, поэтому вы можете добавить утверждения пользователей. (например,{kakaoTalk:true, huawei:true}). В зависимости от случая вам это не нужно. Например, если customProvider - это WhatsApp, то еслиphoneсуществует вfirebaseUser.phoneNumber, это означает, что WhatsApp подключен (даже телефон добавлен с использованием другого поставщика услуг входа). - Если вы разрешите
Anonymousпользователей, то связывание customProvider может не обновлятьfirebaseUser.isAnonymousна клиенте, если адрес электронной почты / телефон не обновлен, клиент по-прежнему будет видеть firebaseUser как анонимный. Одно из решений - проверить, пусты ли connectedProviders, чтобы рассматривать пользователя как анонимного, если это соответствует вашей бизнес-логике. Другое решение - изменение статуса анонимного пользователя, когда вы входите в систему с помощьюsignInWithCustomToken. Поэтому после успешного связывания customProvider выйдите из системы и войдите в систему с помощью customToken, чтобы пользователь не стал анонимным. - Если вы свяжете customProvider с
emailс анонимным пользователем, полеemailэтого пользователя будет обновлено. Это заставит клиента выйти из системы и выброситьFirebaseAuthInvalidUserExceptionс кодом ошибкиERROR_USER_TOKEN_EXPIRED. Пользователь должен снова войти в систему.