Может ли объект аутентификации Firebase обрабатывать одновременные типы аутентификации?

Этот пост описывает, как связать несколько аккаунтов с одним $uid в коллекции users.

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

"rules": {
  "users": {
    "$uid": {
      ".write": "auth != null && 
        (data.val() === null || 
        (auth.provider === 'facebook' && auth.id === data.child('facebookUid').val()) || 
        (auth.provider === 'twitter' && auth.id === data.child('twitterUid').val()))"
    }
  },
  "usersMap": {
    "facebook": {
      "$fuid": {
        ".read": "auth != null && auth.provider === 'facebook' && auth.id === $fuid",
        ".write": "auth != null && 
          (data.val() === null || 
          root.child('users').child(data.val()).child('facebookUid').val() == auth.id)"
      }
    },
    "twitter": {
      "$tuid": {
        ".read": "auth != null && auth.provider === 'twitter' && auth.id === $tuid",
        ".write": "auth != null && 
          (data.val() === null || 
          root.child('users').child(data.val()).child('twitterUid').val() == auth.id)"
      }
    }
  }
}

Вот как я представляю практический способ применения этих правил:

  1. Пользователь "выполняет вход" со своей учетной записью Facebook.

  2. $fuid существует? Если нет, добавьте новый $uid в users. В обратном вызове успеха создайте $fuid под userMap/facebook со значением свойства $fuid.uid, равным также $uid.

  3. Если он существует, просто проигнорируйте запрос и верните сообщение типа «Пользователь уже существует».

Но что делать, если пользователь хочет привязать другую учетную запись к тому же мастеру $uid?

Допустим, пользователь все еще вошел в систему со своей учетной записью Facebook и хочет добавить свою учетную запись Twitter. Давайте еще раз прокрутим этот рабочий процесс...

  1. Пользователь входит в систему с другой учетной записью.

  2. Существует ли $tuid? Нет, но если объект auth содержит сеансы Facebook и Twitter, то мы не хотим создавать еще один $uid — вместо этого мы хотим сопоставить $tuid с тем же $uid, что и $fuid.

    • Поддерживает ли объект auth доступ к свойствам объектов одновременной аутентификации? Например, если бы мы вошли в систему как с Facebook, так и с Twitter, auth.id были бы разными для обоих, верно?

    • Я думаю об этом неправильно? Как можно сопоставить дополнительные учетные записи с $uid, используя приведенные выше правила безопасности?


person Dan Kanze    schedule 05.04.2014    source источник


Ответы (1)


Если вы хотите связать несколько учетных записей с одним uid, вам необходимо сгенерировать свой собственные токены.

Например, вы можете использовать Firebase.push для создания уникальных идентификаторов для каждого пользователя и использовать их в своих токенах. Это не простое дело, так как требует наличия:

  • способ хранения идентификатора пользователя независимо от метода аутентификации (файл cookie?)
  • способ связать учетные записи аутентификации вместе при использовании diff-компьютера

Во многих случаях это может даже привести к обратным результатам; пользователи будут входить в систему с одним методом аутентификации в большинстве случаев и могут даже захотеть использовать различные методы аутентификации для создания отдельных учетных записей. Так что это может не стоить проблем, если у вас нет приложения, которое зависит от обмена данными между провайдерами.

person Kato    schedule 09.04.2014
comment
Но рассмотрим сценарий, в котором пользователь вошел в систему с учетными записями Facebook и Twitter. Как будет выглядеть объект auth? Какие свойства объекта типа аутентификации вы бы увидели? Если я нажму «Выйти», из какой учетной записи я выйду? - person Dan Kanze; 10.04.2014
comment
Вы не можете пройти аутентификацию в Firebase с двумя токенами одновременно. Я не уверен, почему в интерфейсе будет отображаться кнопка входа в Twitter, если я уже вошел в систему через Facebook, но это проблема пользовательского интерфейса, а не Firebase. Если цель состоит в том, чтобы связать учетные записи, то ответом будет создание токенов авторизации самостоятельно и использование идентификатора, не зависящего от поставщика. - person Kato; 11.04.2014