Перейти к основному содержимому

Аутентификация: Сгенерированный код

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

Сначала мы обсудим основную архитектуру аутентификации, а затем рассмотрим изменения кода при выборе пользовательской аутентификации по сравнению с Firebase/Supabase auth.

Структура файлов

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

lib/
auth/
custom_auth/
auth_util.dart
custom_auth_manager.dart
custom_auth_user_provider.dart

Аналогично, когда мы включаем, например, аутентификацию Firebase, для вас генерируются следующие файлы и папки.

lib/
auth/
firebase_auth/
auth_util.dart
email_auth.dart (наряду с другими провайдерами)
firebase_auth_manager.dart
firebase_user_provider.dart
auth_manager.dart
base_auth_user_provider.dart
к сведению

Эта документация исключительно сосредоточена на сгенерированном коде для Пользовательской аутентификации. Для инструкций по интеграции пользовательской аутентификации в ваше приложение FlutterFlow, обратитесь сюда.

Менеджер пользовательской аутентификации

Самым важным компонентом нашей сгенерированной системы аутентификации является класс CustomAuthManager. Он отвечает за управление атрибутами сеанса аутентификации, такими как authenticationToken, refreshToken, tokenExpiration, а также атрибуты, специфичные для пользователя, такие как uid и userData.

Этот класс обеспечивает важные функции, включая: signIn(): Обрабатывает процессы входа пользователя.

signOut(): Управляет действиями выхода пользователя.

updateAuthUserData(): Обновляет данные аутентификации и пользователя.

persistAuthData(): Сохраняет данные аутентификации между сеансами для возможности постоянного входа.

Помимо CustomAuthManager, у нас есть еще один важный файл в нашей аутентификационной структуре: custom_auth_user_provider.dart.

Этот файл определяет класс <ProjectName>AuthUser, который инкапсулирует состояние аутентифицированного пользователя. Он использует BehaviorSubject из пакета rxdart, чтобы управлять потоком объектов пользователя, обеспечивая обновления статуса аутентификации пользователя в реальном времени. Этот поток изначально устанавливается с объектом пользователя, указывающим на состояние выхода из системы. Последующие действия аутентификации обновляют этот поток, обеспечивая реальные изменения любой части приложения, которая зависит от статуса аутентификации пользователя.

С учетом нашей аутентификационной структуры, файл custom_auth_manager.dart включает переменную currentUser, экземпляр класса <ProjectName>AuthUser. Эта глобальная ссылка обеспечивает быстрый и централизованный доступ к информации о текущем вошедшем в систему пользователе, обеспечивая доступ к его статусу аутентификации по всему приложению.

Свойство loggedIn дополнительно упрощает проверку того, вошел ли пользователь в систему, проверяя статус currentUser.

Инициализация менеджера аутентификации

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

final _authManager = CustomAuthManager();
CustomAuthManager get authManager => _authManager;

Метод authManager.initialize() вызывается в main() перед выполнением runApp.

Метод initialize() создает экземпляр SharedPreferences, подготавливая его для authToken, refreshToken и т.д. и также обрабатывает логику истечения срока действия токена, включая автоматический выход из системы при истечении этих токенов.

к сведению

Также обратите внимание, что эту инициализацию выполняют только если опция 'Persist Auth Sessions' включена в настройках Пользовательской аутентификации.

Этот файл также предлагает простые методы получения важной информации, такой как ID пользователя, токен входа и другие данные. Эта настройка упрощает процесс доступа и управления данными входа в систему в вашем приложении.

Реализация входа в систему

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

При вызове метода signIn, внутри этого метода внутри CustomAuthManager вызывается метод _updateCurrentUser.

Этот метод получает различные параметры, такие как authenticationToken, refreshToken, tokenExpiration, authUid и userData, обновляя свойства класса CustomAuthManager этими данными. Следовательно, это сохраняет информацию об аутентификации и пользователе текущего сеанса эффективно.

к сведению

Чтобы узнать больше о понятиях Authentication Token, Refresh Token и Token Expiry Time, обратитесь к документации Concepts.

Новый объект пользователя, помеченный как вошедший в систему (loggedIn установлено в true), а также предоставленный authUid и userData, затем добавляется в поток объектов пользователя, упомянутый ранее. Это обновление информирует всех подписчиков потока о измененном состоянии пользователя, сигнализируя о том, что пользователь успешно вошел в систему.

Дополнительно вызывается метод persistAuthData, чтобы сохранить обновленные данные аутентификации (токены, срок действия, идентификатор пользователя и т.д.) для будущих сеансов.

После входа в систему вызывается context.goNamedAuth('AuthPage', context.mounted);, который перенаправляет пользователя на указанную страницу входа в систему в настройках аутентификации FlutterFlow.