Local development and the SAML test IdP
By Piet de Vries · created 16 Sep 2024, 08:20 UTC · last updated 8 Sep 2026, 13:40 UTC · version 9
local-developmentsamldockeronboarding
Everything runs in Docker on your laptop. Plan an hour the first time.
What you get
| Container | Port | Notes |
|---|---|---|
| identity-service | 8080 | Laravel, with the queue worker and scheduler |
| postgres | 5432 | PostgreSQL 15 |
| redis | 6379 | |
| notifier | 8090 | Mailcrest and Textbridge replaced by local fakes |
| mail-viewer | 8025 | every email notifier "sends" |
| saml-idp | 8443 | the SAML test IdP from tools/saml-idp |
| portal | 5173 | Vite dev server, in the portal repository |
First run
git clone git@github.com:Emargen/acme-identity-service.git
cd acme-identity-service
cp .env.example .env
docker compose up -d
docker compose exec app php artisan migrate --seed
The seeders make three test clients: one on passwords, one with phone codes, and one with single sign-on on two of its depots. Nothing in them is real.
Then the portal:
git clone git@github.com:Emargen/acme-portal.git
cd acme-portal && npm ci && npm run dev
Sign in at http://localhost:5173 as admin@test-client.example with the password in .env.example.
The SAML test IdP
tools/saml-idp is a small SAML identity provider for local work and for reproducing customers' problems.
- You type each sign-in's email and groups into the form
tools/saml-idp/serve.phpserves, so you can copy customers' shapes: per-depot groups likeKEL-Rotterdam-Managers, job-only groups like Brakeline's. - To reproduce a customer's problem, type their email and groups, with names and emails replaced.
- Its signing keys are made on first use in
tools/saml-idp/.keys/and never committed; there is no expired certificate for the certificate errors in the SAML runbook.
SMS and email locally
Phone codes are printed in notifier's log and shown at http://localhost:8025. No real SMS leaves your laptop.
Common problems
- Apple silicon: the saml-idp image is now built for arm64 too. Pull again if it won't start.
- "Unknown certificate" locally: run
docker compose exec app php artisan saml:refresh-local. - Port 5432 taken: a local PostgreSQL is running; stop it or change the port in
.env.
Change history
| Version | Date | Who | What |
|---|---|---|---|
| 6 | 28 May 2026 | Piet | Phone codes locally |
| 7 | 22 Jun 2026 | Marek | Okta-style users in the test IdP |
| 8 | 16 Jul 2026 | Piet | Last update before handing over |
| 9 | 8 Sep 2026 | Jonas | arm64 image, first-run steps checked on a new laptop |