zitadel auth
This commit is contained in:
106
README.md
Normal file
106
README.md
Normal file
@@ -0,0 +1,106 @@
|
||||
# ZITADEL POC
|
||||
|
||||
POC с кастомными формами `login` и `register`, где ZITADEL используется только как backend IdP.
|
||||
|
||||
- `/login` — кастомная форма входа
|
||||
- `/register` — кастомная форма регистрации
|
||||
- `/me` — JSON с claims из JWT, выданного ZITADEL
|
||||
- `/dashboard` — UI, который показывает данные из `/me`
|
||||
|
||||
Приложение не использует hosted login UI ZITADEL для пользовательского входа:
|
||||
|
||||
- не используется `/ui/login/loginname`
|
||||
- не используется `/ui/login/password`
|
||||
- не парсится hosted HTML, CSRF или `authRequestID` старого hosted login
|
||||
- браузер не уходит на hosted SSO-страницы ZITADEL при входе через `http://localhost:3001/login`
|
||||
|
||||
Пароли и учетные записи хранятся в ZITADEL, не в нашем приложении.
|
||||
|
||||
## Запуск
|
||||
|
||||
```bash
|
||||
docker compose down -v
|
||||
docker compose up --build
|
||||
```
|
||||
|
||||
Первый запуск ZITADEL может занять несколько минут.
|
||||
|
||||
## Адреса
|
||||
|
||||
Frontend:
|
||||
|
||||
```txt
|
||||
http://localhost:3001
|
||||
```
|
||||
|
||||
ZITADEL Console:
|
||||
|
||||
```txt
|
||||
http://zitadel.localhost:8081
|
||||
```
|
||||
|
||||
## Как работает вход
|
||||
|
||||
1. Регистрация создает пользователя в ZITADEL через API:
|
||||
|
||||
```txt
|
||||
POST /v2/users/human
|
||||
```
|
||||
|
||||
2. Вход проверяет `email/password` через официальный Session API ZITADEL:
|
||||
|
||||
```txt
|
||||
POST /v2/sessions
|
||||
PATCH /v2/sessions/{sessionId}
|
||||
```
|
||||
|
||||
3. После успешной аутентификации backend завершает OIDC auth request и получает настоящий `id_token` / `access_token` от ZITADEL.
|
||||
|
||||
4. `/me` валидирует и декодирует `id_token`, затем возвращает только claims:
|
||||
|
||||
- `sub`
|
||||
- `email`
|
||||
- `name`
|
||||
- `preferred_username`
|
||||
- `iss`
|
||||
- `aud`
|
||||
- `iat`
|
||||
- `exp`
|
||||
|
||||
5. `/dashboard` показывает именно JSON из `/me`, а не raw JWT.
|
||||
|
||||
## Хранение токенов
|
||||
|
||||
- токены не хранятся в `localStorage`
|
||||
- токены не хранятся в `sessionStorage`
|
||||
- используется `HttpOnly` cookie
|
||||
- используется `SameSite=Lax`
|
||||
- в production cookie должна быть `Secure=true`
|
||||
- в local dev `Secure=false`
|
||||
|
||||
## Password Policy
|
||||
|
||||
Локальная валидация и ZITADEL policy выровнены под тот же набор правил, что и в проекте Authentik:
|
||||
|
||||
- минимум 8 символов
|
||||
- хотя бы одна заглавная буква
|
||||
- хотя бы одна строчная буква
|
||||
- хотя бы одна цифра
|
||||
|
||||
## Logout
|
||||
|
||||
```txt
|
||||
POST /logout
|
||||
```
|
||||
|
||||
Этот endpoint очищает cookie приложения и закрывает ZITADEL session, если она есть.
|
||||
|
||||
## Out Of Scope
|
||||
|
||||
В рамках этого POC не реализованы:
|
||||
|
||||
- sessions UI
|
||||
- consent UI
|
||||
- MFA devices UI
|
||||
- connected services
|
||||
- app passwords
|
||||
Reference in New Issue
Block a user