Million Miles Authentik POC
POC с кастомными формами login/register, где Authentik используется только как backend IdP.
Что реализовано
/login— кастомная формаEmail / Password / Войти/register— кастомная формаFull name / Email / Password / Confirm passwordAuthentikиспользуется как backend для пользователей, паролей и OIDC- наше приложение не хранит пароль и не хранит password hash
- регистрация создаёт пользователя через
Authentik API - login выполняется backend-to-backend через
Authentik flow/executor API - после login backend получает
id_tokenиaccess_tokenотAuthentik - токены не хранятся в
localStorageилиsessionStorage - токены хранятся только в
HttpOnlycookie сSameSite=Lax /meвозвращает claims из JWT после валидации токена на backend/dashboardпоказывает claims из/me, без вывода raw JWT
Что вне scope
- sessions UI
- consent UI
- MFA devices UI
- connected services
- app passwords
Порты
Порты проброшены только на localhost:
- frontend:
http://localhost:3000 - Authentik admin:
http://localhost:9000
Быстрый старт
- Скопируй
.env.exampleв.env - Для локального теста можно использовать такие значения:
AUTHENTIK_IMAGE=docker.io/authentik/server
AUTHENTIK_TAG=2026.2.2
PG_DB=authentik
PG_USER=authentik
PG_PASS=authentik
AUTHENTIK_SECRET_KEY=change-me-local-secret
AUTHENTIK_BOOTSTRAP_EMAIL=admin@millionmiles.local
AUTHENTIK_BOOTSTRAP_PASSWORD=admin123456
AUTHENTIK_BOOTSTRAP_TOKEN=local-bootstrap-token-change-me
APP_URL=http://localhost:3000
AUTHENTIK_PUBLIC_URL=http://localhost:9000
AUTHENTIK_INTERNAL_URL=http://host.docker.internal:9000
AUTHENTIK_API_TOKEN=local-bootstrap-token-change-me
AUTHENTIK_LOGIN_FLOW=mm-custom-authentication-flow
OIDC_CLIENT_ID=mm-custom-frontend
OIDC_CLIENT_SECRET=mm-custom-secret
OIDC_ISSUER=http://localhost:9000/application/o/mm-custom-frontend/
OIDC_REDIRECT_URI=http://localhost:3000/auth/callback
COOKIE_SECURE=false
AUTH_DEBUG=false
- Запусти проект:
docker compose up --build
Если нужен полностью чистый запуск:
docker compose down -v
docker compose up --build
Как зайти в админку Authentik
Открой:
http://localhost:9000
Для локального теста из примера выше:
email: admin@millionmiles.local
password: admin123456
Как это работает
- Регистрация пользователя идёт через
Authentik API - Пароль хранится в
Authentik, не в нашем приложении - Login идёт через кастомную форму на нашем frontend
- Backend проверяет логин/пароль через
Authentik flow/executor API - После успешного login backend получает
id_tokenиaccess_tokenотAuthentik - Токены кладутся в
HttpOnlycookie /meчитает токен из cookie, валидирует JWT и возвращает claims JSON/dashboardпоказывает именно эти claims
Что создаёт blueprint
Flow: Million Miles Custom Authentication
Slug: mm-custom-authentication-flow
OAuth2/OIDC Provider: Million Miles Custom Frontend
Application slug: mm-custom-frontend
Client ID: mm-custom-frontend
Client Secret: mm-custom-secret
Redirect URI: http://localhost:3000/auth/callback
Ручная проверка
- Открой
http://localhost:3000/register - Зарегистрируй нового пользователя
- Проверь, что форма требует:
Полное имя,Email,Пароль,Подтвердите пароль - Проверь валидацию пароля: минимум 8 символов, одна заглавная, одна строчная, одна цифра
- После регистрации перейди на
http://localhost:3000/login - Войди через кастомную форму
email/password - После входа открой
http://localhost:3000/me - Убедись, что
/meвозвращает JSON с claims:sub,email,name,preferred_username,username,iss,aud,iat,exp - Открой
http://localhost:3000/dashboard - Убедись, что dashboard показывает claims без raw JWT
- Нажми
Выйтии проверь, чтоPOST /logoutочищает cookie и возвращает на/login
Что проверить в админке
В Authentik admin можно проверить:
Applications -> Applications -> Million Miles
Applications -> Providers -> Million Miles Custom Frontend
Flows and Stages -> Flows -> Million Miles Custom Authentication
Directory -> Users
Важно
COOKIE_SECURE=falseподходит только для локальной разработки поhttp- в production нужно использовать
COOKIE_SECURE=true
Description
Languages
JavaScript
99.6%
Dockerfile
0.4%