[Lv1] Как была реализована аутентификация в прошлых проектах?
Цель: Чётко объяснить за 3–5 минут, «как фронтенд обрабатывает вход, управление состоянием и защиту страниц», чтобы легко вспомнить на собеседовании.
1. Ключевые тезисы для ответа на собеседовании
- Три этапа процесса входа: Отправка формы → Верификация на сервере → Сохранение токена и перенаправление.
- Управление состоянием и токеном: Pinia с персистентностью, Axios Interceptor для автоматического прикрепления Bearer Token.
- Обработка после входа и защита: Инициализация общих данных, route guard'ы, выход из системы и крайние случаи (OTP, принудительная смена пароля).
Начните с этих трёх ключевых тезисов, затем расширяйте по мере необходимости, показывая интервьюеру, что у вас есть целостное понимание.
2. Компоненты системы и их ответственность
| Модуль | Расположение | Роль |
|---|---|---|
authStore | src/stores/authStore.ts | Хранит состояние входа, персистирует токен, предоставляет getter'ы |
useAuth Hook | src/common/hooks/useAuth.ts | Инкапсулирует процесс входа/выхода, единый формат возврата |
| Login API | src/api/login.ts | Вызывает серверный POST /login, POST /logout |
| Axios Utility | src/common/utils/request.ts | Request/Response Interceptor, единая обработка ошибок |
| Route Guard | src/router/index.ts | Проверяет meta для определения необходимости входа |
| Инициализация | src/common/composables/useInit.ts | Проверяет наличие токена при запуске приложения, загружает необходимые данные |
Мнемоника: «Store управляет состоянием, Hook управляет потоком, Interceptor управляет каналом, Guard управляет страницами.»
3. Процесс входа (пошагово)
Шаг 0. Форма и предварительная валидация
- Поддерживает два метода входа: пароль и SMS-код подтверждения.
- Базовая валидация перед отправкой (обязательные поля, формат, debounce).
Шаг 1. Вызов Login API
const { status, data, code } = await useApi(login, payload);
useApiединообразно обрабатывает ошибки и состояние загрузки.- При успехе
dataвозвращает токен и основную информацию о пользователе.
Шаг 2. Обработка ответа сервера
| Сценарий | Поведение |
|---|---|
| Требуется дополнительная верификация (например, подтверждение личности при первом входе) | Установить authStore.onBoarding в true, перенаправить на страницу верификации |
| Принудительная смена пароля | Перенаправить в процесс смены пароля с необходимыми параметрами |
| Обычный успех | Вызвать authStore.$patch() для сохранения токена и информации о пользователе |
Шаг 3. Общие действия после входа
- Получить профиль пользователя и список кошельков.
- Инициализировать персонализированный контент (например, список подарков, уведомления).
- Перенаправить на внутреннюю страницу на основе
redirectили предопределённого маршрута.
Успешный вход — это лишь полдела — общие данные должны быть загружены на этом этапе, чтобы каждая страница не выполняла отдельные API-вызовы.
4. Управление жизненным циклом токена
4.1 Стратегия хранения
authStoreвключаетpersist: true, записывая ключевые поля вlocalStorage.- Плюсы: Состояние автоматически восстанавливается после перезагрузки страницы. Минусы: Необходимо учитывать XSS и безопасность.
4.2 Axios Request Interceptor
if (needToken) {
const { access_token } = auth.value;
config.headers.Authorization = `Bearer ${access_token}`;
}
- API, требующие авторизации, автоматически включают Bearer Token.
- API, явно помеченные
needToken: false(вход, регистрация и т.д.), пропускают прикрепление токена.
4.3 Обработка истечения и исключений
- Если сервер возвращает ответ о просроченном или недействительном токене, Response Interceptor единообразно преобразует его в уведомление об ошибке и запускает процесс выхода.
- Механизм Refresh Token может быть добавлен как расширение, но текущий проект использует упрощённую стратегию.
5. Защита маршрутов и инициализация
5.1 Route Guard
router.beforeEach((to, from, next) => {
const { needAuth, goRouteIfNoToken } = to.meta;
if (needAuth && !authStore.isLogin) {
return next({ name: goRouteIfNoToken || 'Login' });
}
next();
});
- Использует
meta.needAuthдля определения необходимости проверки статуса входа. - Перенаправляет на страницу входа или указанную публичную страницу, если пользователь не авторизован.
5.2 Инициализация при запуске приложения
useInit выполняет следующее при запуске приложения:
- Проверяет, содержит ли URL
login_tokenилиplatform_token— если да, выполняет автоматический вход или устанавливает токен. - Если в Store уже есть токен, загружает информацию о пользователе и общие данные.
- Если токена нет, остаётся на публичной странице и ждёт ручного входа пользователя.
6. Процесс выхода (очистка)
- Вызвать
POST /logoutдля уведомления сервера. - Выполнить
reset():authStore.$reset()очищает информацию о входе.- Связанные store (информация о пользователе, избранное, коды приглашений и т.д.) также сбрасываются.
- Очистить кеши на стороне браузера (например, кеши localStorage).
- Перенаправить на страницу входа или главную страницу.
Выход — это зеркальное отражение входа: дело не только в удалении токена — необходимо убедиться, что всё зависимое состояние очищено, чтобы избежать утечки данных.
7. Частые вопросы и лучшие практики
- Декомпозиция потока: Разделяйте вход и инициализацию после входа, чтобы hook'и оставались лаконичными.
- Обработка ошибок: Единообразно через
useApiи Response Interceptor для обеспечения согласованного поведения UI. - Безопасность:
- Всегда используйте HTTPS.
- При хранении токенов в
localStorageбудьте осторожны с XSS для чувствительных операций. - Рассмотрите расширение с помощью httpOnly Cookies или Refresh Token при необходимости.
- Расширяемость: Крайние случаи, такие как OTP и принудительная смена пароля, обрабатываются гибко — hook возвращает статус для обработки на уровне представления.
8. Мнемоники для быстрого ответа на собеседовании
- «Ввод → Валидация → Сохранение → Перенаправление»: Используйте этот порядок для описания общего потока.
- «Store управляет состоянием, Interceptor управляет заголовками, Guard блокирует неавторизованный доступ»: Подчеркните архитектурное разделение.
- «Загружайте общие данные сразу после входа»: Демонстрирует чувствительность к пользовательскому опыту.
- «Выход — это сброс одним нажатием + перенаправление на безопасную страницу»: Покрывает безопасность и завершённость потока.