#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. Поэтому я не могу доверять ему, поскольку он говорит «есть пользователь», а затем сразу «Ах, нет, извините, нет», чтобы убедиться, что пользователь существует для приложения. Как я могу это решить?