@mineflow/auth-web
Web-адаптер аутентификации MineFlow Client SDK. Реализует порт TokenProvider из @mineflow/client-core поверх keycloak-js: PKCE-флоу, упреждающий авто-refresh access-token'а и маппинг Keycloak realm-ролей в канонический SystemRole.
Что это и зачем
По ADR-0042 SDK разбит на слои. @mineflow/auth-web — это L3, платформенный auth-адаптер для браузера. Его задача узкая: дать остальным слоям SDK два метода — «откуда взять свежий access-token» (getToken) и «какие у пользователя роли» (getRoles). Транспорт, хуки и схемы живут в других пакетах; здесь только мост между keycloak-js и абстрактным портом TokenProvider.
Адаптер web-only: keycloak-js завязан на браузерное окружение (redirect-флоу, silent-SSO через iframe). Для React Native существует отдельный пакет-аналог @mineflow/auth-native на react-native-app-auth, реализующий тот же интерфейс TokenProvider. Ниже подробнее в разделе React Native.
В 95% веб-кейсов вы используете @mineflow/auth-web вместе с @mineflow/client-react (хуки + MineflowProvider) и @mineflow/api-zod (валидация форм). См. обзор слоёв в client-core.
Установка
pnpm add @mineflow/auth-web
pnpm add keycloak-js # peer-зависимость, ^26.0.0
keycloak-js объявлен как peerDependency (^26.0.0) — вы устанавливаете его сами и инициализируете один раз на старте приложения. Сам пакет зависит только от @mineflow/client-core (для типа порта TokenProvider).
Использование
Шаг 1 — инициализируйте keycloak-js (один раз при старте):
import Keycloak from 'keycloak-js';
import { KeycloakTokenProvider } from '@mineflow/auth-web';
const keycloak = new Keycloak({
url: import.meta.env.VITE_KEYCLOAK_URL, // например http://localhost:8080
realm: 'mineflow',
clientId: 'mineflow-web',
});
await keycloak.init({
onLoad: 'check-sso',
pkceMethod: 'S256',
silentCheckSsoRedirectUri: window.location.origin + '/silent-check-sso.html',
});
// Оборачиваем в TokenProvider
const tokenProvider = new KeycloakTokenProvider({ keycloak });
Шаг 2 — отдайте провайдер и роли в MineflowProvider из @mineflow/client-react:
import { MineflowProvider } from '@mineflow/client-react';
<MineflowProvider
baseUrl={import.meta.env.VITE_API_BASE}
tokenProvider={tokenProvider}
generateId={() => crypto.randomUUID()}
roles={tokenProvider.getRoles()}
>
{children}
</MineflowProvider>;
После этого getToken вызывается транспортом SDK автоматически перед каждым запросом — заголовок Authorization: Bearer <token> подставляется без вашего участия, а токен обновляется по порогу minValiditySeconds.
Логин и логаут
KeycloakTokenProvider намеренно не оборачивает вход/выход — управляйте ими через keycloak-js напрямую:
keycloak.login(); // redirect на страницу входа Keycloak
keycloak.logout(); // redirect на logout-эндпоинт
keycloak.authenticated; // boolean — текущее состояние
Типичный паттерн: при ответе API 401 (после того как getToken({ forceRefresh: true }) не помог) UI инициирует keycloak.login().