Komplexní autentizační a autorizační SDK pro platformu BlackCat. Cílem je nabídnout centrální logiku, aby frontend/edge služby nemusely vymýšlet vlastní tokeny, refresh mechanismy ani RBAC – vše jde přes AuthManager a přidružené služby.
- Více typů tokenů – krátkodobé přístupové tokeny (JWT kompatibilní), refresh tokeny, servisní tokeny pro backend-backend komunikaci.
- RBAC jádro –
PolicyDecisionPoint+RoleRegistrypodporují role, skupiny i dynamické politiky (ABAC hooky). - Integrace s Crypto – podpisy tokenů lze delegovat na
blackcat-crypto(AEAD/HMAC). Pokud crypto není dostupné, fallback na lokální klíče. - IdentityProvider rozhraní – snadno napojíš databázi, LDAP, OAuth brokera atd.
- HTTP/CLI rozšíření – vestavěný mini server (
auth-http) pro testování login/refresh/PKCE/client-creds a CLI (bin/auth) pro vydávání tokenů, správu rolí, audit. - Password & email hashing –
PasswordHashers pepper providerem aDatabaseUserProviders pluggable EmailHasher (KeyManager/crypto friendly). - Login limiter – ochrana proti brute-force (tabulky
login_attempts+register_eventszblackcat-database), deterministické HMAC přes crypto ingress; HTTP vrací429+Retry-After. - Front-end friendly – hotové middleware/guards pro REST/GraphQL, rozhraní pro PKCE (S256/PLAIN), device-code a service-to-service flows.
- Audit hooky & PKCE store –
AuthEventHookInterfaceumožňuje logovat každou autentizaci,PkceStoreInterfacedrží authorization codes s nastavitelným TTL. - OIDC discovery –
/.well-known/openid-configurationa/jwks.jsonstaví metadata/JWKS automaticky z konfigurace (HS512octklíč,jwks_uri, granty…). - Device-code & session management –
/device/*endpoints s pending store a/sessionAPI pro rolling sessions (Database/Redis store přes konfiguraci).
blackcat-auth/
├── src/
│ ├── AuthManager.php # hlavní fasáda
│ ├── Config/ # AuthConfig + env loader
│ ├── Token/ # token service, JWT/JWE podpisy
│ ├── Rbac/ # role, policy decision point
│ ├── Identity/ # IdentityProvider rozhraní
│ ├── Http/ # jednoduchý HTTP server + middleware
│ ├── CLI/ # příkazy pro správu
│ ├── Middleware/ # PSR-15 guardy
│ └── Support/ # pomocné třídy (Clock, Encoder…)
├── docs/ROADMAP.md
├── README.md
├── composer.json
├── bin/auth
└── tests/
composer install
php bin/auth help
php bin/auth-http --port=8082config/example.auth.phpje kanonický vstup. Podporuje${env:FOO}/${file:/path}placeholdery a může načítat sdílené profily zblackcat-config/config/profiles.php. Doporučený způsob spuštění CLI je tedy vždy přes konfig:
export BLACKCAT_AUTH_SIGNING_KEY=$(openssl rand -base64 32)
export BLACKCAT_AUTH_PEPPER=$(openssl rand -base64 32)
php bin/auth config/example.auth.php config:show- Seed & správa uživatelů – Stage 1 CLI přidává
users:seed,users:list,user:hash-passwordatoken:*příkazy, které používají databázový store (MySQL/Postgres) přesBlackCat\Core\Database+blackcat-databasea crypto ingress (deterministickéemail_hashlookupy). Stačí přizpůsobituser_storesekci v konfigu:
php bin/auth config/example.auth.php users:seed --force
php bin/auth config/example.auth.php users:list
php bin/auth config/example.auth.php token:issue --user=admin@example.com --password=secret
php bin/auth config/example.auth.php security:check-
Telemetry & bezpečnost –
telemetry.promsoubor (viztelemetry.prometheus_file) se aktualizuje přesTelemetryAuthHook.security:checkověřuje délku signing key, dostupnost DB a zda je nastavena telemetry/pepper.bin/auth-http --config=...používá stejné konfigurační hodnoty +UserStoreFactorypro HTTP server, takže CLI/HTTP sdílí jednu konfiguraci. -
Integrace na ostatní repa – config podporuje
config_profile(čteblackcat-config),user_storepoužíváblackcat-databaseschéma (userstabulka) a signing key/pepper se běžně generují/uchovávají vblackcat-crypto. Stage 1 tak splňuje checklist: config loader, CLI vstupy (config:show,users:list,token:*), telemetry, security checks + docs/tests.
V aplikaci:
use BlackCat\Auth\AuthManager;
use BlackCat\Auth\Config\AuthConfig;
use BlackCat\Auth\Identity\ArrayUserProvider;
use BlackCat\Auth\Password\PasswordHasher;
use BlackCat\Auth\Password\EnvPepperProvider;
$config = AuthConfig::fromEnv();
$provider = new ArrayUserProvider([
['id' => '1', 'email' => 'admin@example.com', 'password' => 'secret', 'roles' => ['admin']],
]);
$hasher = new PasswordHasher(new EnvPepperProvider());
$auth = AuthManager::boot($config, $provider);
$login = $auth->issueTokens('admin@example.com', 'secret');
$claims = $auth->verifyAccessToken($login->accessToken);
$auth->enforce('admin', $claims); // RBAC checkcomposer test
php bin/auth config/example.auth.php config:show
php bin/auth config/example.auth.php users:seed --force
php bin/auth config/example.auth.php users:list
php bin/auth config/example.auth.php token:issue --user=admin@example.com --password=secret
php bin/auth config/example.auth.php token:client --client=service-api --secret=supersecret
php bin/auth config/example.auth.php rbac:check --role=admin --claims='{"roles":["admin"]}'
php bin/auth config/example.auth.php user:hash-password --password="MyStrongPass"
php bin/auth-http --config=config/example.auth.php --port=8082
Endpointy:
| Endpoint | Popis |
|---|---|
POST /login |
Password grant (username, password). |
POST /register |
Registrace uživatele (`email |
POST /verify-email |
Verifikace e-mailu (token) + aktivace uživatele + vydání token pair. |
POST /verify-email/resend |
Znovu vystaví verifikační token (`email |
POST /password-reset/request |
Vystaví reset token (`email |
POST /password-reset/confirm |
Spotřebuje reset token (token, new_password) a nastaví nové heslo. |
POST /token |
OAuth-like token endpoint (`grant_type=password |
POST /authorize |
PKCE init (client_id, username, password, code_challenge, code_challenge_method). |
POST /introspect |
Ověření access tokenu / refresh tokenu. |
GET /healthz |
Základní health probe. |
GET /.well-known/openid-configuration |
OIDC discovery dokument (issuer, endpoints, granty). |
GET /jwks.json |
JWKS se seznamem klíčů (aktuálně oct pro HS512). |
GET /userinfo |
Vrátí claims aktuálního uživatele (vyžaduje Bearer token). |
POST /session |
Issuance session ID (Bearer token + volitelné context metadata). |
GET /session |
Výpis aktivních sessions aktuální identity. |
DELETE /session/{id} |
Zneplatní konkrétní session (pokud patří aktuálnímu subjektu). |
POST /device/code |
Vygeneruje device & user code pro offline zařízení. |
POST /device/activate |
Uživatelská aktivace – zadá user_code + přihlašovací údaje. |
POST /device/token |
Zařízení polluje, dokud nedostane access/refresh tokeny. |
POST /magic-link/request |
Vystaví magic-link pro zadaný e-mail (non-enumerating); pokud je nakonfigurován mailing, zařadí e-mail do DB fronty. Dev-only může vrátit token/link (BLACKCAT_AUTH_DEV_RETURN_MAGICLINK_TOKEN=1). Při throttlingu vrací 429 + Retry-After. |
POST /magic-link/consume |
Spotřebuje magic-link token a vrací token pair. |
POST /webauthn/register/start |
(Bearer) Vrátí challenge pro registraci bezpečnostního klíče. |
POST /webauthn/register/finish |
(Bearer) Uloží credential. |
POST /webauthn/authenticate/start |
Spouští přihlášení – vrací challenge a allowed credential IDs. |
POST /webauthn/authenticate/finish |
Dokončí WebAuthn přihlášení, vrací token pair (volitelně sign_count pro anti-replay). |
GET /events/stream |
Vrací poslední auth události (events + last_id), vhodné pro SSE polling. |
BLACKCAT_AUTH_REQUIRE_EMAIL_VERIFICATION=1(default) udržuje nové účtyusers.is_active=0do ověření.BLACKCAT_AUTH_DEV_RETURN_VERIFICATION_TOKEN=1vracíverification_tokenv odpovědi (dev-only).BLACKCAT_AUTH_EMAIL_VERIFICATION_LINK_TEMPLATE="https://app.example.com/verify?token={token}"přidáverification_link.- V produkci se verifikační e-mail posílá přes DB frontu
notifications(vizblackcat-mailing) – auth pouze vloží notifikaci, worker ji odešle přes SMTP. - Pro config-file režim je kanonické nastavení v
blackcat-auth/config/example.auth.php(sekcemailing+auth.registration). - Throttling pro
/verify-email/resendnastav přesBLACKCAT_AUTH_VERIFY_EMAIL_RESEND_THROTTLE_*(vrací429+Retry-After).
# 1) Register (dev odpověď může obsahovat verification_token + verification_link)
curl -X POST http://localhost:8082/register -d '{"email":"user@example.com","password":"secret"}'
# 2) Verify email (spotřebuje token a vrací access/refresh tokeny)
curl -X POST http://localhost:8082/verify-email -d '{"token":"<selector>.<validator>"}'BLACKCAT_AUTH_PASSWORD_RESET_TTL=3600nastaví TTL reset tokenu (default 3600).BLACKCAT_AUTH_PASSWORD_RESET_LINK_TEMPLATE="https://app.example.com/reset-password?token={token}"přidáreset_link.BLACKCAT_AUTH_DEV_RETURN_PASSWORD_RESET_TOKEN=1vracíreset_tokenv odpovědi (dev-only).- Pokud je nakonfigurován
blackcat-mailing,auth-httpzařadí e-mail do DB frontynotifications(templatereset_password). - Throttling pro
/password-reset/requestnastav přesBLACKCAT_AUTH_PASSWORD_RESET_THROTTLE_*(vrací429+Retry-After).
# 1) Request reset (always returns ok; dev může vrátit reset_token + reset_link)
curl -X POST http://localhost:8082/password-reset/request -d '{"email":"user@example.com"}'
# 2) Confirm reset (spotřebuje token a nastaví nové heslo)
curl -X POST http://localhost:8082/password-reset/confirm -d '{"token":"<selector>.<validator>","new_password":"newSecret"}'$verifier = bin2hex(random_bytes(32));
$challenge = \BlackCat\Auth\Pkce\PkceHelper::challengeFromVerifier($verifier);
$code = $auth->initiatePkce('service-api', 'admin@example.com', 'secret', $challenge);
$tokens = $auth->exchangePkce('service-api', $code, $verifier);use BlackCat\Auth\Session\SessionService;
use BlackCat\Auth\Session\InMemorySessionStore;
$sessions = new SessionService(new InMemorySessionStore(), 60 * 60 * 24 * 14); // 14 dní
$auth = $auth->withSessionService($sessions);
$pair = $auth->issueTokens('admin@example.com', 'secret');
$session = $auth->issueSession($auth->verifyAccessToken($pair->accessToken), ['ip' => '127.0.0.1']);Pozn.: BlackCat\\Auth\\Session\\* jsou BC aliasy na blackcat-sessions (BlackCat\\Sessions\\*).
Pro produkci nastav BLACKCAT_AUTH_SESSION_TTL a BLACKCAT_AUTH_SESSION_STORE (např. {"type":"database"} nebo {"type":"redis","uri":"tcp://redis:6379","prefix":"auth:sessions"}) – v režimu database se používá blackcat-database tabulka sessions.
# 1) Zařízení (bez klávesnice) požádá o kód
curl -X POST http://localhost:8082/device/code -d '{"client_id":"device-client","scope":"openid"}'
# 2) Zobrazí se user_code a verification_uri -> uživatel otevře /device/activate
# 3) Aktivace
curl -X POST http://localhost:8082/device/activate -d '{"user_code":"ABCD1234","username":"demo@example.com","password":"secret"}'
# 4) Zařízení polluje
curl -X POST http://localhost:8082/device/token -d '{"device_code":"<device_code>"}'# 1) Požádej o magic link
curl -X POST http://localhost:8082/magic-link/request \
-H "Content-Type: application/json" \
-d '{"email":"demo@example.com","redirect":"/dashboard"}'
# 2) V ostrém prostředí odejde e-mail (template `magic_link` přes blackcat-mailing); v dev režimu může být v odpovědi `token` a `link`
# 3) Uživatelský klient odešle token
curl -X POST http://localhost:8082/magic-link/consume \
-H "Content-Type: application/json" \
-d '{"token":"<token>"}'Magic link TTL nastav BLACKCAT_AUTH_MAGICLINK_TTL (sekundy) a BLACKCAT_AUTH_MAGICLINK_URL (frontend stránka, která token spotřebuje). Pro dev/test můžeš zapnout BLACKCAT_AUTH_DEV_RETURN_MAGICLINK_TOKEN=1 (vrátí token/link v odpovědi); v produkci se posílá e-mail přes blackcat-mailing (DB queue notifications, template magic_link). Throttling nastav přes BLACKCAT_AUTH_MAGICLINK_THROTTLE_* (viz níže).
auth-http udržuje kruhový buffer auditních událostí (výchozí 200 položek, nastav BLACKCAT_AUTH_EVENTS_BUFFER). Endpoint /events/stream?last_id=123 vrací JSON:
{
"last_id": 42,
"events": [
{"id": 41, "event": "password_grant", "payload": {"username": "demo@example.com","result":"success"}, "timestamp": 1710000000}
]
}Pro SSE-like chování klient periodicky volá endpoint s last_id a doručuje jen nové položky. Velikost bufferu nastav BLACKCAT_AUTH_EVENTS_BUFFER.
Audity snadno přepošleš do observability vrstvy:
use BlackCat\Auth\Support\StreamingAuthHook;
use BlackCat\Observability\ObservabilityManager;
$obs = ObservabilityManager::boot();
$hook = new StreamingAuthHook(fn($event, $payload) => $obs->events()->publish('auth.' . $event, $payload));
$auth = AuthManager::boot($config, $provider, logger: null, hook: $hook);# Registrace (uživatel musí mít Bearer token)
curl -H "Authorization: Bearer <token>" -X POST http://localhost:8082/webauthn/register/start
curl -H "Authorization: Bearer <token>" -H "Content-Type: application/json" \
-d '{"challenge":"...","credential_id":"cred-1","public_key":"base64public"}' \
http://localhost:8082/webauthn/register/finish
# Přihlášení
curl -X POST http://localhost:8082/webauthn/authenticate/start -d '{"email":"demo@example.com"}'
curl -X POST http://localhost:8082/webauthn/authenticate/finish \
-H "Content-Type: application/json" \
-d '{"email":"demo@example.com","challenge":"...","credential_id":"cred-1"}'Pro aktivaci nastav BLACKCAT_AUTH_WEBAUTHN_RP_ID (např. auth.example.com) a BLACKCAT_AUTH_WEBAUTHN_RP_NAME (zobrazované jméno). Implementace zatím uchovává credentialy v paměti – pro produkci je potřeba vlastní store (Redis/DB).
use BlackCat\Auth\Support\LoggingAuthHook;
$logger = new \Monolog\Logger('auth');
$auth = AuthManager::boot($config, $provider, $logger, null, new LoggingAuthHook($logger));Konfigurační proměnná BLACKCAT_AUTH_EVENT_WEBHOOKS (JSON list URL) umožňuje zároveň odesílat události na externí webhooks (POST JSON).
BLACKCAT_AUTH_ROLES– JSON definice rolí/permissions.BLACKCAT_AUTH_CLIENTS– JSON map (client_id=>{secret,roles,scopes,access_ttl,pkce}).BLACKCAT_AUTH_PKCE_TTL– TTL pro authorization codes (sekundy, default 300).BLACKCAT_AUTH_USERS– JSON fallback uživatelů proauth-http(pokud nepoužívá DB).BLACKCAT_AUTH_DB_DSN(+_USER,_PASS) – DSN pro databázový user store (MySQL/Postgres,blackcat-databaseschémausers).- Runtime config:
crypto.keys_dir(+ volitelněcrypto.manifest) – konfigurace crypto ingress pro deterministickéemail_hashlookupy (single source of truth pro mapy jepackages/*/schema/encryption-map.jsonvblackcat-database). BLACKCAT_AUTH_HTTP_PORT– implicitní port HTTP serveru.BLACKCAT_AUTH_BASE_URL– veřejná URL použitá pro OIDC discovery endpoints (https://auth.example.com).BLACKCAT_AUTH_SESSION_TTL– pokud je > 0, aktivuje session service (/sessionendpointy) s daným TTL v sekundách.BLACKCAT_AUTH_SESSION_STORE– JSON konfigurace session storage ({"type":"database"}nebo{"type":"redis","uri":"tcp://redis:6379","prefix":"myapp:sessions"}).BLACKCAT_AUTH_PASSWORD_RESET_TTL– TTL reset tokenů (sekundy; default 3600).BLACKCAT_AUTH_PASSWORD_RESET_LINK_TEMPLATE– link template pro FE reset URL (.../reset-password?token={token}).BLACKCAT_AUTH_DEV_RETURN_PASSWORD_RESET_TOKEN– dev-only: vracíreset_token+reset_linkv/password-reset/request.BLACKCAT_AUTH_PASSWORD_RESET_THROTTLE_WINDOW_SEC– délka window (sekundy; default 300).BLACKCAT_AUTH_PASSWORD_RESET_THROTTLE_MAX_PER_IP– limit pro/password-reset/requestper-IP (default 50).BLACKCAT_AUTH_PASSWORD_RESET_THROTTLE_MAX_PER_EMAIL– limit pro/password-reset/requestper-email (default 3).BLACKCAT_AUTH_VERIFY_EMAIL_RESEND_THROTTLE_WINDOW_SEC– délka window (sekundy; default 300).BLACKCAT_AUTH_VERIFY_EMAIL_RESEND_THROTTLE_MAX_PER_IP– limit pro/verify-email/resendper-IP (default 50).BLACKCAT_AUTH_VERIFY_EMAIL_RESEND_THROTTLE_MAX_PER_EMAIL– limit pro/verify-email/resendper-email (default 3).BLACKCAT_AUTH_MAGICLINK_TTL– TTL pro magic link tokeny (sekundy).BLACKCAT_AUTH_MAGICLINK_URL– veřejná URL kam se má magic link směrovat (např.https://app.example.com/magic-login).BLACKCAT_AUTH_DEV_RETURN_MAGICLINK_TOKEN– dev-only: vracítoken+linkv/magic-link/request.BLACKCAT_AUTH_MAGICLINK_THROTTLE_WINDOW_SEC– délka window (sekundy; default 300).BLACKCAT_AUTH_MAGICLINK_THROTTLE_MAX_PER_IP– limit pro/magic-link/requestper-IP (default 100).BLACKCAT_AUTH_MAGICLINK_THROTTLE_MAX_PER_EMAIL– limit pro/magic-link/requestper-email (default 5).BLACKCAT_AUTH_WEBAUTHN_RP_ID/BLACKCAT_AUTH_WEBAUTHN_RP_NAME– aktivuje WebAuthn endpoints (RP ID/Name).BLACKCAT_AUTH_WEBAUTHN_CHALLENGE_TTL– TTL pro WebAuthn challenge (sekundy; default 600).BLACKCAT_AUTH_EVENTS_BUFFER– velikost kruhového bufferu pro/events/stream(default 200).BLACKCAT_AUTH_EVENT_WEBHOOKS– JSON seznam webhook URL, kam se posílají audit eventy.
- Roadmapa je v
docs/ROADMAP.md. auth-httpposlouží jako referenční server pro testování grantů;bin/authobsahuje i audit/telemetrické helpery (viz nové příkazy).
This repository is an official component of the Blackcat Covered System. It is licensed under BFNL-1.0, and repository separation inside BLACKCAT_MESH_NEXUS exists for maintenance, safety, auditability, delivery, and architectural clarity. It does not by itself create a separate unavoidable founder-fee or steward/development-fee event for the same ordinary covered deployment.
Canonical licensing bundle: