Подтвердить что ты не робот

Как я могу войти в систему с несколькими социальными службами с Firebase?

Я хочу, чтобы пользователи могли аутентифицироваться в моем приложении Firebase, используя несколько разных поставщиков auth, таких как Facebook, Twitter или Github. После аутентификации я хочу, чтобы пользователи имели доступ к одной учетной записи независимо от того, какой метод auth они использовали.

Другими словами, я хочу объединить несколько методов auth в одну учетную запись в моем приложении. Как я могу сделать это в приложении Firebase?

4b9b3361

Ответ 1


Обновление (20160521): Firebase только что выпустила основное обновление для своего Firebase Authentication продукта, который теперь позволяет одному пользователю связывать аккаунты от различных поддерживаемых провайдеров. Чтобы узнать больше об этой функции, прочитайте документацию для iOS, Web и Android. Ответ, приведенный ниже, оставлен по историческим причинам.


Основная служба Firebase предоставляет несколько методов аутентификации: https://www.firebase.com/docs/security/authentication.html

В своей основе Firebase использует защищенные токены JWT для аутентификации. Все, что приводит к созданию токена JWT (например, использование библиотеки JWT на вашем собственном сервере), будет работать для аутентификации ваших пользователей в Firebase, поэтому вы полностью контролируете процесс аутентификации.

Firebase предоставляет услугу Firebase Simple Login, которая является одним из способов генерации этих токенов (это обеспечивает наш Facebook, Twitter и т.д. auth). Он предназначен для общих сценариев аутентификации, так что вы можете быстро запускать и запускать без сервера, но это не единственный способ аутентификации и не предназначен для комплексного решения.

Здесь один подход для разрешения входа в систему с несколькими провайдерами с использованием Firebase Simple Login:

  • Храните один канонический идентификатор пользователя для каждого пользователя и сопоставление для каждый идентификатор провайдера к одному каноническому идентификатору.
  • Обновите свои правила безопасности, чтобы соответствовать любому из учетных данных на данной учетной записи пользователя, а не только одной.

На практике правила безопасности могут выглядеть так, если вы хотите включить аутентификацию Twitter и Facebook (или разрешить пользователю создавать учетную запись с одним, а затем добавлять другое):

{
  "users": {
    "$userid": {
      // Require the user to be logged in, and make sure their current credentials
      // match at least one of the credentials listed below, unless we're creating
      // a new account from scratch.
      ".write": "auth != null && 
        (data.val() === null || 
        (auth.provider === 'facebook' && auth.id === data.child('facebook/id').val() || 
        (auth.provider === 'twitter' && auth.id === data.child('twitter/id').val()))"
    }
  },
  "user-mappings": {
    // Only allow users to read the user id mapping for their own account.
    "facebook": {
      "$fbuid": {
        ".read": "auth != null && auth.provider === 'facebook' && auth.id === $fbuid",
        ".write": "auth != null && 
          (data.val() == null || 
          root.child('users').child(data.val()).child('facebook-id').val() == auth.id)"
      }
    },
    "twitter": {
      "$twuid": {
        ".read": "auth != null && auth.provider === 'twitter' && auth.id === $twuid",
        ".write": "auth != null && 
          (data.val() == null || 
          root.child('users').child(data.val()).child('twitter-id').val() == auth.id)"
      }
    }
  }
}

В этом примере вы сохраняете один глобальный идентификатор пользователя (который может быть любым по вашему выбору) и поддерживать сопоставление между механизмами аутентификации Facebook, Twitter и т.д. в основной записи пользователя. После входа в систему для каждого пользователя вы будете извлекать основную запись пользователя из сопоставлений пользователя и использовать этот идентификатор в качестве основного хранилища пользовательских данных и действий. Вышеупомянутое также ограничивает и проверяет данные в пользовательских сопоставлениях, так что их может написать только соответствующий пользователь, у которого уже есть тот же идентификатор пользователя Facebook, Twitter и т.д. Под /users/ $userid/(facebook-id | twitter -id | и т.д.-идентификатор).

Этот метод позволит вам быстро встать и работать. Тем не менее, , если у вас сложный прецедент и вы хотите получить полный контроль над опытом auth, вы можете запустить собственный собственный код на своих серверах. Есть много полезных библиотек с открытым исходным кодом, которые вы можете использовать для этого, например everyauth и passport.

Вы также можете аутентифицироваться с использованием сторонних поставщиков услуг. Например, вы можете использовать Singly, который имеет огромное количество интеграций из коробки, без необходимости писать любой серверный код.

Ответ 2

Я знаю, что это сообщение существует в течение нескольких месяцев, но когда я столкнулся с этой проблемой, понадобилось много времени, чтобы сделать код более гибким. Основываясь на коде Andrew выше, я немного изменил код.

Пример хранилища данных:

userMappings
|---facebook:777
|   |---user:"123"
|---twitter:888
    |---user:"123"
users
|---123
    |---userMappings
        |---facebook: "facebook:777"
        |---twitter: "twitter:888"

Правила безопасности:

"userMappings": {
  "$login_id": {
    ".read": "$login_id === auth.uid",
    ".write": "auth!== null && (data.val() === null || $login_id === auth.uid)"
  }
},

"users": {
  "$user_id": {
    ".read": "data.child('userMappings/'+auth.provider).val()===auth.uid",
    ".write": "auth!= null && (data.val() === null || data.child('userMappings/'+auth.provider).val()===auth.uid)"
  }
}

Итак, userMappings по-прежнему является первой информацией, которую мы просматриваем при входе в Facebook, Twitter.... пользователь userMappings укажет на основную учетную запись в пользователей. Поэтому после входа в систему Facebook или Twitter мы можем найти основную учетную запись пользователя. В users мы сохраняем список userMapping, который может получить доступ к своим данным.

При создании нового пользователя сначала необходимо создать учетную запись в users. Идентификатор пользователя может быть любым, что мы хотим. Это гибко, потому что мы можем предоставить больше логинов, таких как Google, Github, не добавляя больше правил безопасности.

Ответ 3

Я только что создал декоратор углового огня, чтобы справиться с этим для нас: angularfire-multi-auth

Ответ 4

Я потратил немало времени на хорошее решение, и ИМХО, чтобы иметь возможность зарегистрироваться у любого провайдера, просто сбивает с толку. В моем интерфейсе я всегда прошу зарегистрировать электронную почту, поэтому, например, регистрация пользователей с помощью facebook и google + будет регистрироваться как один и тот же пользователь, когда он сообщит о своем письме.

Таким образом, примерные данные, предложенные Kuma, не должны дублировать пользовательские сопоставления.

Хранилище с образцами данных

userMappings
|---facebook:777
|   |---user:"123"
|---twitter:888
    |---user:"123"
users
|---123
    |---user data