Download the PHP package musikhood/auth-client-bundle without Composer

On this page you can find all versions of the php package musikhood/auth-client-bundle. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.

FAQ

After the download, you have to make one include require_once('vendor/autoload.php');. After that you have to import the classes with use statements.

Example:
If you use only one package a project is not needed. But if you use more then one package, without a project it is not possible to import the classes with use statements.

In general, it is recommended to use always a project to download your libraries. In an application normally there is more than one library needed.
Some PHP packages are not free to download and because of that hosted in private repositories. In this case some credentials are needed to access such packages. Please use the auth.json textarea to insert credentials, if a package is coming from a private repository. You can look here for more information.

  • Some hosting areas are not accessible by a terminal or SSH. Then it is not possible to use Composer.
  • To use Composer is sometimes complicated. Especially for beginners.
  • Composer needs much resources. Sometimes they are not available on a simple webspace.
  • If you are using private repositories you don't need to share your credentials. You can set up everything on our site and then you provide a simple download link to your team member.
  • Simplify your Composer build process. Use our own command line tool to download the vendor folder as binary. This makes your build process faster and you don't need to expose your credentials for private repositories.
Please rate this library. Is it a good library?

Informations about the package auth-client-bundle

auth-client-bundle

Symfony bundle dla paneli, które delegują uwierzytelnianie do centralnego auth servera: logowanie, 2FA, refresh, wylogowanie, JWT/JWKS, ciasteczka HttpOnly (BEARER + refresh_token) i introspekcja sesji z circuit breakerem. Front (@musikhood-dev/auth-client) nigdy nie widzi JWT.

Od 0.8 paczka działa bez konfiguracji: integrator podaje tylko dane panelu w env, a auth-client:install + auth-client:doctor robią resztę. Pełna checklista podpięcia panelu (admin → backend → front → 2FA → problemy): INTEGRATION.md.

Agent AI podpinający panel: AI_INTEGRATION.md (w paczce: vendor/musikhood/auth-client-bundle/AI_INTEGRATION.md; auth-client:install i auth-client:doctor wypisują tę ścieżkę).

Quick start (5 minut)

  1. Admin tworzy panel w panelu administracyjnym auth servera (origin frontu, webhook URL = URL backendu panelu) i zapisuje AUTH_BASE_URL, panel_id, client_id, client_secret w bazie dostępów Work HUB.
  2. Instalacja paczki:

  3. Adres auth servera i dane panelu do .env.local (lokalnie) / sekretu k8s — z bazy dostępów Work HUB (secret_to_env): AUTH_BASE_URL (np. https://auth.example.com), AUTH_PANEL_ID, AUTH_CLIENT_ID, AUTH_CLIENT_SECRET. Wszystkie cztery są wymagane — bundle nie ma wbudowanego adresu auth servera (od 0.8.1).
  4. Konfiguracja security, CORS, tras i trusted proxies (pokazuje zmiany i pyta przed zapisem):

  5. Weryfikacja — ma być zielono:

  6. Front: npm i @musikhood-dev/auth-client@^2.3.1 i npx @musikhood-dev/auth-client init (README paczki).

Gotowe. Nie potrzebujesz encji User, tabeli ani migracji (tryb bezstanowy). Polityka 2FA (off / optional / required) i device binding — wyłącznie w panelu administracyjnym auth servera.

Endpoint Flex jest opcjonalny. Bez niego Flex i tak rejestruje bundle w config/bundles.php, a auth-client:install dopisuje import tras i klucze AUTH_* do .env. Jeśli chcesz recipe (gotowy auth_client.yaml z 4 liniami env i komunikat po instalacji), raz w projekcie:

Jak działa

Komendy

bin/console auth-client:install

Opcje: --dry-run (tylko pokaż), --yes (zapisz bez pytania), --no-doctor.

Plik Co robi
.env dopisuje puste AUTH_BASE_URL i AUTH_PANEL_ID/CLIENT_ID/CLIENT_SECRET (z komentarzem o bazie dostępów) i SYMFONY_TRUSTED_PROXIES=private_ranges — tylko klucze, których nie ma w .env ani w środowisku (.env.local, sekrety)
config/routes/auth_client.yaml import tras bundla (jeśli nigdzie go nie ma)
config/packages/security.yaml brak pliku / domyślny plik Symfony → pełna konfiguracja (sekcje when@* zachowane); własne firewalle → nic nie nadpisuje: sprawdza pokrycie tras bundla (kolejność jak w Symfony) i jeśli czegoś brakuje, wypisuje dokładny fragment do wklejenia
config/packages/nelmio_cors.yaml (jeśli jest NelmioCorsBundle) allow_credentials: true, allow_headers += X-Device-Fp, expose_headers += Retry-After; plik, którego nie da się bezpiecznie edytować → fragment do wklejenia; brak Nelmio → instrukcja
config/packages/framework.yaml tylko Symfony < 7.2: trusted_proxies: '%env(default::SYMFONY_TRUSTED_PROXIES)%' (7.2+ czyta env sam)

Na końcu uruchamia auth-client:doctor (po zapisie — w nowym procesie, z nową konfiguracją). Drugie uruchomienie nic nie zmienia.

bin/console auth-client:doctor

Sprawdza i wypisuje ✔ / ! / ✘ z podpowiedzią, co zrobić (exit code ≠ 0 przy błędzie — nadaje się do CI / smoke testu po deployu). Nigdy nie wypisuje sekretów.

Wymagania

Instalacja ręczna (bez auth-client:install)

security.yaml — dokładnie to, co generuje install (SecurityConfigurator::template()):

Trasy: config/routes/auth_client.yaml z resource: '@AuthClientBundle/Resources/config/routes.yaml'. CORS i trusted proxies — jak w tabeli auth-client:install wyżej.

Opcjonalnie: lokalna kopia userów (encja + tabela)

Potrzebne tylko, gdy aplikacja chce trzymać userów u siebie (np. relacje w bazie, wyszukiwanie po e-mailu w zapytaniach). Gdy kontener ma implementację PanelUserRepositoryInterface, bundle używa jej zamiast trybu bezstanowego — bez żadnej innej zmiany konfiguracji.

Encja User

Paczka nigdy nie pisze do tabeli użytkowników — to robi konsument. Zaimplementuj Musikhood\AuthClient\Contract\PanelUserInterface (referencja: docs/example-entity.php):

Jeśli używasz innej lokalizacji niż src/Entity/ (np. DDD ze strukturą src/Domain/User/Entity/User.php), umieść klasę gdziekolwiek — paczka patrzy tylko na kontrakt PanelUserInterface.

UserRepository

Zaimplementuj Musikhood\AuthClient\Contract\PanelUserRepositoryInterface i powiąż go z interfejsem przez atrybut #[AsAlias]. Dzięki temu nie musisz nic dopisywać do services.yaml — Symfony sam podepnie repo pod interfejs.

Referencja: docs/example-repository.php.

Atrybut #[AsAlias] wymaga Symfony 6.1+. Jeśli z jakiegoś powodu wolisz mapowanie w YAML-u, zamiast atrybutu dodaj do config/services.yaml:

Bez aliasu bundle używa trybu bezstanowego (od 0.8 — wcześniej rzucał wyjątek).

Tabela w bazie

Albo skopiuj docs/example-migration.sql prosto do swojego narzędzia migracji, albo wygeneruj migrację z encji:

Tabela potrzebuje kolumn: id (UUID), email (unique), display_name, roles_for_panel (JSON), disabled (bool), last_synced_at. Pełny mapping w docs/example-entity.php.

Synchronizacja z auth serverem

Auth server jest jedynym źródłem prawdy dla ról, displayName i flagi disabled. Kopia użytkownika po stronie panelu — w trybie bezstanowym snapshot w cache.app, w trybie z lokalną tabelą wiersz w bazie — jest aktualizowana w dwóch momentach:

  1. Pierwszy kontakt z userem (bootstrap) — gdy authenticator widzi zalogowanego usera, którego jeszcze nie ma w lokalnej tabeli, paczka tworzy kopię z claimów świeżego JWT (email, displayName, role per-panel). To jednorazowe — przy każdym kolejnym requeście tego usera authenticator NIE rusza już lokalnej kopii.
  2. Co ~30s na żądanie zalogowanego usera — AuthValidationListener woła introspekcję na auth serverze (POST /api/auth/backend/introspect) i synchronizuje pełen payload (email, displayName, role per-panel, flaga disabled). To jest jedyna ścieżka aktualizacji istniejącej kopii. Krok pomijany jeśli wynik z poprzedniego wywołania jeszcze leży w cache (validation_cache_ttl, domyślnie 30s).

W szczególności paczka nie używa lokalnej flagi isDisabled() do podejmowania decyzji o autoryzacji. Gating disabled userów leci wyłącznie przez /me — co znaczy że:

Lokalne pole disabled (w encji konsumenta albo w snapshot'cie trybu bezstanowego) służy tylko do wyświetlenia. Aktualizowane automatycznie przez syncFromMe().

Tryb bezstanowy przechowuje snapshot w cache.app (TTL 24 h) — utrata cache jest nieszkodliwa (user zostaje odtworzony z JWT, a następna introspekcja go zsynchronizuje). Zalecany Redis, żeby workery widziały ten sam stan.

Webhook inwalidacji (0s revocation)

Od wersji 0.3.0 paczka nasłuchuje webhooków od auth servera i skraca czas rewokacji sesji z ~30s (poll /me opisany wyżej) do setek milisekund.

Jak to działa. Po inwalidacji usera (zablokowanie konta, zmiana hasła, odebranie dostępu do panelu) auth server podbija tokenVersion i pushuje podpisany webhook na endpoint paczki POST /api/auth-client/webhook/user-invalidated. Paczka weryfikuje podpis (WebhookJwtValidator, ten sam JWKS co user JWT), zapisuje nową tokenVersion w cache (UserTokenVersionStore) i kasuje cache walidacji usera. Przy najbliższym requeście tego usera JwtCookieAuthenticator porównuje ver z jego JWT z zapisaną wartością i odrzuca stary token (401) bez czekania na poll /me.

Co musisz zrobić.

  1. Ścieżka webhooka musi być publiczna — auth-client:install umieszcza ją w firewallu login (lista tras publicznych: Musikhood\AuthClient\Routing\PublicRoutes). Webhook autoryzuje się sam podpisem JWT auth servera — to model jak weryfikacja podpisu webhooków Stripe/GitHub, nie dziura w security.
  2. W panelu admin auth servera ustaw pole „Webhook URL" dla swojego panelu na bazowy URL backendu mikroserwisu (np. https://api.example.com). Auth server sam dokleja ścieżkę /api/auth-client/webhook/user-invalidated.
  3. Upewnij się, że cache.app jest skonfigurowane (Redis zalecany — stan musi być współdzielony między procesami workerów i przeżyć restart).

Nie musisz nic zmieniać w swojej encji. tokenVersion żyje w cache PSR, nie w kolumnie DB — webhook może przyjść nawet dla usera, którego mikroserwis jeszcze nie zna lokalnie. Reset cache (flush Redisa) jest nieszkodliwy: brak wpisu = pass, a poll /me dogoni inwalidację w ~30s (fallback).

Monolog tip. Jeśli używasz fingers_crossed z action_level: error (typowy prod default Symfony), logi webhook.received (poziom info) będą buforowane i tracone, gdy webhook kończy się 200 OK — bufor jest zrzucany tylko gdy w tym samym requeście wystąpi error. Żeby widzieć je w kubectl logs, dodaj osobny handler/channel ze stream do php://stderr na poziomie info.

Kontrakt z front-endem

Front nigdy nie widzi JWT. Wymaga:

Kontrakt 401 vs 403: 401 = sesja martwa (globalne wylogowanie po nieudanym refreshu), 403 = brak dostępu do panelu (sesja żyje, bez czyszczenia).

To ten sam kontrakt co przy gadaniu wprost z auth serverem, więc istniejący front przesiada się na inny backend bez zmian.

Pełna konfiguracja

Plik config/packages/auth_client.yaml jest opcjonalny — wszystkie klucze mają domyślne wartości (dane panelu z env). Recipe wgrywa tylko cztery linie z env, żeby było widać, skąd biorą się dane. Pełny dump: bin/console config:dump-reference auth_client.

same_site domyślnie lax — wystarcza, gdy front i API są w tej samej domenie rejestrowalnej (SameSite liczy się po „site”, nie po hoście): panel.example.com + panel-api.example.com, localhost na różnych portach. none ustaw tylko, gdy front i API są w różnych domenach (np. panel.example.com ↔ api.example.org) — wymaga secure: true (HTTPS) i osłabia ochronę przed CSRF.

API token (autoryzacja maszynowa)

Drugi sposób autoryzacji obok ciasteczek — dla klientów server-to-server, które nie mają sesji przeglądarkowej. Klient wysyła per-user-per-panel token w nagłówku X-Api-Token (format mhpat_…), bez logowania, ciasteczek ani refreshu.

ApiTokenAuthenticator reaguje tylko gdy nagłówek jest obecny, więc współistnieje z JwtCookieAuthenticator w tym samym firewallu — bez nagłówka stary cookie flow działa bez zmian. Token jest weryfikowany live przez introspekcję na auth serverze (POST /api/auth/backend/api-token/verify) — paczka nie trzyma kopii, więc revoke po stronie auth servera = natychmiastowa rewokacja (następny request → 401). Gdy auth server jest niedostępny, authenticator robi fail-closed (401).

Role pochodzą z panelRoles introspekcji (z prefiksem ROLE_), tak samo jak przy JWT — istniejące #[IsGranted('ROLE_PUBLISH')] działają bez zmian. Token jest generowany / regenerowany / usuwany wyłącznie przez admina w panelu auth servera („niezmienny" = brak edycji wartości; zmiana = regeneracja, stary natychmiast martwy).

2FA (TOTP) i wiązanie sesji z urządzeniem (>= 0.7)

Wymaga auth servera z wydaniem 2FA. Front: @musikhood-dev/auth-client >= 2.2. Panel z polityką 2FA off (domyślnie) i user bez 2FA = zachowanie bajt w bajt jak w 0.6.

Endpointy wystawiane przez paczkę

Metoda Ścieżka Opis
POST /api/login Wymienia {username, password} na ciasteczka BEARER + refresh_token.
POST /api/logout (alias /api/token/invalidate) Czyści ciasteczka, unieważnia refresh token w auth serverze.
POST /api/token/refresh Generuje nową parę ciasteczek z refresh tokena.
GET /api/v1/user/me Zwraca dane zalogowanego użytkownika (id, email, displayName, roles, disabled). Czyta z lokalnej kopii — nie wymaga round-tripa do auth servera.
POST /api/login/mfa (0.7) Drugi krok logowania 2FA: {mfa_token, code \| recovery_code, remember_device?, device?} → ciasteczka jak /api/login. Publiczny.
POST /api/session/mfa (0.7) Step-up sesji po 403 mfa_step_up: {code \| recovery_code, remember_device?, device?} + ciasteczko refresh_token → nowe ciasteczka. Publiczny (autoryzacja refresh tokenem).
POST /api/mfa/enrollment/request (0.7) Link do konfiguracji 2FA dla zalogowanego usera: {password} (wymagane aktualne hasło) + ciasteczko refresh_token → {enrollment_url}; 401 invalid_credentials, 409 mfa_already_enabled, 429. Publiczny (refresh token + hasło).
POST /api/auth-client/webhook/user-invalidated Webhook inwalidacji usera (0s revocation). Autoryzacja podpisem JWT auth servera (nie user auth — wymaga PUBLIC_ACCESS w access_control). Patrz „Webhook inwalidacji".

Licencja

MIT — patrz LICENSE.


All versions of auth-client-bundle with dependencies

PHP Build Version
Package Version
Requires php Version >=8.2
ext-openssl Version *
firebase/php-jwt Version ^6.10 || ^7.0
psr/cache Version ^2.0 || ^3.0
psr/log Version ^2.0 || ^3.0
ramsey/uuid Version ^4.7
symfony/cache-contracts Version ^2.5 || ^3.0
symfony/config Version ^6.4 || ^7.0
symfony/console Version ^6.4 || ^7.0
symfony/dependency-injection Version ^6.4 || ^7.0
symfony/event-dispatcher Version ^6.4 || ^7.0
symfony/framework-bundle Version ^6.4 || ^7.0
symfony/http-client Version ^6.4 || ^7.0
symfony/http-client-contracts Version ^2.5 || ^3.0
symfony/http-foundation Version ^6.4 || ^7.0
symfony/http-kernel Version ^6.4 || ^7.0
symfony/routing Version ^6.4 || ^7.0
symfony/security-bundle Version ^6.4 || ^7.0
symfony/security-core Version ^6.4 || ^7.0
symfony/security-http Version ^6.4 || ^7.0
symfony/yaml Version ^6.4 || ^7.0
Composer command for our command line client (download client) This client runs in each environment. You don't need a specific PHP version etc. The first 20 API calls are free. Standard composer command

The package musikhood/auth-client-bundle contains the following files

Loading the files please wait ...