Аутентификация: Сгенерированный код
В 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.