Как принудительно выйти из Firebase аутентификации пользователя из приложения удаленно - PullRequest
0 голосов
/ 31 октября 2018

У меня есть проект, который использует аутентификацию firebase с firebaseUI для аутентификации пользователей. Я включил Google, Facebook и поставщиков электронной почты. Мне нужно удаленно выйти из системы или отключить некоторых пользователей.

Я хочу, чтобы пользователи выходили из приложения. Я попытался отключить пользователя в консоли Firebase, а также использовал SDK администратора Firebase (https://firebase.google.com/docs/auth/admin/manage-sessions), чтобы отозвать токены обновления.

Я ждал более 2 дней и все еще заметил, что пользователь вошел в систему и может получить доступ к данным пожарного депо.

Я тоже прошел и попробовал Firebase все еще получает authData после удаления

Кто-нибудь может указать на то, что я делаю неправильно?

Ответы [ 4 ]

0 голосов
/ 15 ноября 2018

Пока не тестировалось, так как наш бэкэнд-программист, отвечающий за настройку правил Firestore, ушел на день, но теоретически это должно сработать: (и это то, что я протестирую завтра)

Наличие FirebaseAuth.AuthStateListener, отвечающего за обслуживание пользовательского интерфейса в зависимости от статуса пользователя

Это в сочетании с правилами в пожарном магазине

match /collection
allow read: if isAuth();

Где isAuth:

function isAuth() {
  return request.auth.uid != null;
}

Если пользователь затем отключается во время входа в систему, то всякий раз, когда пользователь пытается прочитать данные из коллекции, ему должно быть отказано и должен быть выполнен вызов signOut (). Затем AuthStateListener обнаружит его и выйдет из системы.

0 голосов
/ 10 ноября 2018

Вы можете отправить сообщение с данными с помощью FCM, чтобы принудительно выйти из системы.

Например, если пользователи используют приложение для Android.

  1. Сохранение токена FCM в коллекции в Firebase Realtime.
  2. настроить клиентское приложение Android, в сервисе. ССЫЛКА Вы должны сделать, когда получите сообщение с особенной строкой, заставить выйти из системы.
  3. делает триггер, который вам нужен в облачных функциях, для отправки данных LINK , когда вам нужно выйти из системы.

УСПЕХ!

0 голосов
/ 10 ноября 2018

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

Используйте одну глобальную переменную для хранения TokenNo (может быть в общих настройках или sqlite):

Добавьте следующий код в манифест:

<service android:name=".YourFirebaseMessagingService">
 <intent-filter>
     <action android:name="com.google.firebase.MESSAGING_EVENT" />
 </intent-filter>
</service>

Добавьте следующий код в

public class LogoutOntokenchange extends FirebaseMessagingService{
   @Override
   public void onNewToken (String token){
     if(TokenNo=>1){ //if tokenNo >=1 means he already logged in
       TokenNo=0;
       FirebaseAuth.getInstance().signOut(); //Then call signout method
     }
     else{
       TokenNo=1; //store token no in db
     }
   }
}

Что здесь происходит:
Когда пользователь вошел в систему в первый раз, вызывается onNewToken, затем он переходит в другое, тогда TokenNo обновляется до 1 с 0.
Когда вы отключаете любого пользователя, автоматически обновляется токен. Затем вызывается OnNewToken, затем TokenNo> = 1, поэтому пользователь выходит из системы.

ПРИМЕЧАНИЕ: Когда пользователь входит в систему впервые, т.е. если переменная TokenNo не сохранена, сохраните ее как 0.

Для справки: https://firebase.google.com/docs/reference/android/com/google/firebase/messaging/FirebaseMessagingService

0 голосов
/ 10 ноября 2018

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

Нет способа отозвать токен доступа после чеканки. Это означает, что даже если вы отключите учетную запись пользователя, он может продолжать иметь доступ в течение часа.

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

Например, в базе данных реального времени вы можете создать список UID заблокированных пользователей:

banned_uids
  uid1: true
  uid2: true

А затем проверьте это в правилах безопасности с помощью:

".read": "auth.uid !== null && !root.child('banned_uids').child(auth.uid).exists()"
...