Как убедиться, что пользователь Firebase был удален

#ios #firebase #firebase-authentication

#iOS #firebase #firebase-аутентификация

Вопрос:

Я знаю, что по этому поводу есть немало вопросов, но у меня немного другой.

Вот сценарий:

  • Я создаю пользователя в своем приложении iOS в Firebase
  • Я удаляю пользователя в Firebase
  • через 10 дней я запускаю свое приложение

Как я могу узнать, что пользователь был удален?

Что происходит прямо сейчас:

 Auth.auth().currentUser != nil
 

потому что мое приложение / Firebase кэширует пользователя

Затем я вызываю:

 user.reload { error in ... }
 

Это дает мне следующую ошибку:

 Optional<Error>
  - some : Error Domain=FIRAuthErrorDomain Code=17999 "An internal error has occurred, print and inspect the error details for more information." UserInfo={FIRAuthErrorUserInfoNameKey=ERROR_INTERNAL_ERROR, NSLocalizedDescription=An internal error has occurred, print and inspect the error details for more information., NSUnderlyingError=0x6000026f2be0 {Error Domain=FIRAuthInternalErrorDomain Code=3 "(null)" UserInfo={FIRAuthErrorUserInfoDeserializedResponseKey={
    code = 400;
    errors =     (
                {
            domain = global;
            message = "INVALID_REFRESH_TOKEN";
            reason = invalid;
        }
    );
    message = "INVALID_REFRESH_TOKEN";
}}}}
 

Очевидно, что токен обновления больше не используется ( —> 400 ).

Однако, как я могу определить разницу между «этот токен больше не действителен, потому что он не использовался годами» и «этот токен больше не действителен, потому что этот пользователь больше не существует»?

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

Существует ли конкретный список кодов ошибок, которые я должен рассмотреть «попросить пользователя снова войти в систему»? Есть ли пуленепробиваемый способ справиться с этим?

Спасибо

Редактировать:

это код, который я использую для отслеживания изменений пользователя

 class StartViewModel: ObservableObject {
 
    @Published var hasAuthenticatedUser: Bool = false
    @Published var isRefreshing: Bool = false
    
    var user: User! {
        didSet {
            if oldValue != nil amp;amp; user == nil {
                self.hasAuthenticatedUser = false
            }
            if oldValue == nil amp;amp; user != nil {
                self.hasAuthenticatedUser = true
            }
        }
    }
    
    private var listenerHandle: AuthStateDidChangeListenerHandle!
    
    init() {
        listenerHandle = Auth.auth().addStateDidChangeListener { [weak self] _, user in
            if let self = self {
                self.user = user
            }
        }
        
        if Auth.auth().currentUser != nil {
            self.isRefreshing = true
            self.user = Auth.auth().currentUser
            user.reload { error in
             // Here I get the 400 error
            }
        }
    }
    
 

Редактировать:

Здесь я обнаружил кое-что еще. Приложение не запускалось неделями, и пользователь больше не существует на стороне Firebase. Это код, который я запустил:

         listenerHandle = Auth.auth().addStateDidChangeListener { [weak self] _, user in
            if let self = self {
                
                if user != nil {
                    debugPrint("Has authenticated user")
                } else {
                    debugPrint("Does not have authenticated user")
                }
                
 

Регистратор показывает мне:

 Has authenticated user
 

сразу после этого

 Does not have authenticated user
 

Как я могу быть уверен, что пользователь, которого я получил при первом вызове, действительно существует? Я создаю свой пользовательский интерфейс в зависимости от того, есть пользователь или нет, и он просто переключается между «ах, да» и «НЕТ» за доли секунды.

Комментарии:

1. 1) «Что происходит прямо сейчас: Auth.auth().currentUser != nil » Это не должно происходить через 10 дней, поскольку токен ID действителен только в течение часа. Можете ли вы показать более полный код, в котором вы выполняете эту проверку? 2) В общем, рекомендуется использовать прослушиватель, как показано в первом фрагменте в firebase.google.com/docs/auth/ios /…

2. Вы хотите сказать, что если я убью приложение дольше часа, CurrentUser всегда будет равен нулю? Я просто добавил больше кода

3. Вы не должны явно reload указывать пользователю в addStateDidChangeListener . Ваш идентификационный токен (и на его основе пользователь) получит автоматическое обновление, что на самом деле происходит, когда ваш addStateDidChangeListener обратный вызов вызывается для начала.

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

5. Я обнаружил кое-что еще @FrankvanPuffelen. Я запускаю свою среду Firebase локально. Он был полностью сброшен, и я неделями не запускал приложение, которое я разрабатываю. Я только что запустил его, и что происходит, так это то, что Auth.auth().addStateDidChangeListener отправляет мне объект user (предыдущего сеанса несколько недель назад) и сразу после этого отправляет мне нулевой объект user. Поэтому я не могу доверять ему, поскольку он говорит «есть пользователь», а затем сразу «Ах, нет, извините, нет», чтобы убедиться, что пользователь существует для приложения. Как я могу это решить?