Аутентификация: Сгенерированный код
В FlutterFlow включение аутентификации — это очень простая задача. Вы можете ознакомиться с документацией по этой теме здесь, но в идеале это просто включение аутентификации в настройках, выбор типа аутентификации и добавление действия к нужной кнопке аутентификации. Однако за кулисами происходит множество операций по генерации кода, чтобы сделать эту функцию доступной для вас. Давайте разберём их по порядку.
Сначала мы обсудим базовую архитектуру аутентификации, а затем рассмотрим изменения в коде при выборе пользовательской аутентификации по сравнению с аутентификацией Firebase/Supabase.
Структура файлов
При включении аутентификации в панели настроек с оздаются следующие папки в структуре файлов для управления пользовательской аутентификацией.
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 (along with other providers)
firebase_auth_manager.dart
firebase_user_provider.dart
auth_manager.dart
base_auth_user_provider.dart
Эта документация посвящена исключительно сгенерированному коду для пользовательской аутентификации. Для инструкций по интеграции пользовательской аутентификации в ваше приложение FlutterFlow обратитесь сюда.
Менеджер пользовательской аутентификации
Наиболее важный компонент нашей сгенерированной системы аутентификации — это CustomAuthManager class. It is responsible for managing authentication session attributes such as the authenticationToken, refreshToken, tokenExpiration, and user-specific attributes like uid and 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».

Этот файл также предоставляет удобные геттеры для получения важной информации, такой как идентификатор пользователя, токен входа и другие данные. Такая настройка упрощает процесс доступа и управления данными входа по всему приложению.
Реализация входа
При активации действия входа путём нажатия кнопки за кулисами запускается серия операций, чтобы обеспечить плавный процесс входа.
При вызове метода signIn внутренне запускается метод _updateCurrentUser из CustomAuthManager.
Этот метод принимает различные параметры, такие как 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.