- CONTEXT_LAST_SESSION.md: documento completo di tutto lo sprint B2B - mktg-api-doc.html: Quick Start box con chiave attiva, flusso visivo 4 step, curl pronti - integrazioniext.html tab Inviti: tabella "Chi fa cosa" per ruolo, sezione mktg-agile con chiave API + 3 curl pronti, Quick Start aggiornato con tabella risorse per destinatario Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
6.1 KiB
6.1 KiB
Contesto Ultima Sessione — NIS2 Agile
Data: 2026-03-07 Dominio produzione: https://nis2.agile.software/
Cosa è stato fatto in questa sessione
Sprint B2B / Integrazioni / Licenze
1. Migrazione dominio
- DNS A record
nis2.agile.software → 135.181.149.254via Cloudflare API - SSL Let's Encrypt certbot (
/etc/letsencrypt/live/nis2.agile.software/) - Apache vhost HTTPS abilitato
- Redirect 301 da
nis2.certisource.it → nis2.agile.software
2. Test runner
public/test-runner.php— tokenNis2Test2026, SSE streaming, dark terminal UI- Bottone
Reset + Simula + Testa Tutto(dark green, top Test tab) docs/sql/reset-demo.sqlaggiornato: mantiene semprecristiano.benassati@gmail.com(super_admin,Silvia1978!@)
3. Integrazioni B2B (ServicesController)
POST /api/services/token— API Key → JWT 15minPOST /api/services/sso— SSO federato con responsabilità utente, JWT 2hPOST /api/services/provision— provisioning automatico org+utente+api_key da invitologExternalCall()in BaseController per audit trail chiamate esterneBaseController::base64UrlEncode/Decodecambiati da private a protected
4. Sistema Inviti / Licenze
application/controllers/InviteController.php— CRUD inviti- Auth:
requireLicenseAuth()accetta X-API-Key (admin:licenses) O JWT super_admin POST /api/invites/create— genera tokeninv_xxx, SHA-256 in DBGET /api/invites/list— lista con filtri status/channelGET /api/invites/{id}— dettaglioDELETE /api/invites/{id}— revocaPOST /api/invites/{id}/regenerate— nuovo tokenGET /api/invites/validate?token=— pubblica, nessuna authstatic resolveInvite()/static markUsed()— usati da provision
- Auth:
ServicesController::provision()aggiornato:- Accetta
invite_tokennel body (B2B flow) OX-Provision-Secret(admin diretto) - Piano e durata forzati dall'invito
- Chiama
InviteController::markUsed()dopo provisioning riuscito - Salva
license_max_usersnell'org
- Accetta
public/index.phpaggiornato: route/api/invites/*
5. DB Migrations applicate in produzione
- 011_provisioning.sql:
organizations+provisioned_by, +license_plan, +license_expires_at, +lg231_company_id;users+must_change_password, +phone, +job_title;api_keys+created_by - 012_invites.sql: tabella
invites(token_hash, plan, duration_months, max_uses, expires_at, channel, restrict_vat/email, status, used_by_org_id) - 013_license_ext.sql:
invites+max_users_per_org, +price_eur, +reseller_name;organizations+license_max_users
6. Pagine HTML nuove
public/integrazioniext.html— documentazione partner tecnici (lg231, e-commerce)- Tab: Services API, Inviti & Licenze, Guida lg231, Webhook, Quick Start
public/licenseExt.html— pannello marketing per gestione licenze- Login JWT super_admin, stats strip, genera licenze, lista/filtri, revoca/rigenera, export CSV
public/mktg-api-doc.html— risponde alle 6 domande marketing- Quick start, endpoint, auth, response format, lista, revoca, spiegazione pagine
public/nis2-license-api.postman.json— Postman collection scaricabiledocs/integration/nis2-license-api.postman.json— copia in repo
7. API Key mktg-agile (generata in produzione)
- Chiave:
nis2_mktg_8c8bd38e78fccb9faa749d8601051f42 - Scope:
admin:licenses - DB api_keys.id: 1
- Scade: 2028-03-07
8. Documentazione lg231
docs/integration/lg231-nis2-integration.md— spec completa per agente Claude lg231public/settings.html— aggiunto scopeadmin:licenses,admin:org,sso:loginal form API Keys
File creati o modificati
| File | Azione |
|---|---|
application/controllers/InviteController.php |
NUOVO |
application/controllers/ServicesController.php |
MODIFICATO (provision + sso + token) |
application/controllers/BaseController.php |
MODIFICATO (base64Url protected) |
application/config/config.php |
MODIFICATO (PROVISION_SECRET) |
public/index.php |
MODIFICATO (route invites) |
public/integrazioniext.html |
NUOVO |
public/licenseExt.html |
NUOVO |
public/mktg-api-doc.html |
NUOVO |
public/nis2-license-api.postman.json |
NUOVO |
public/settings.html |
MODIFICATO (scopes) |
public/js/common.js |
MODIFICATO (sidebar link integrazioniext) |
docs/sql/011_provisioning.sql |
NUOVO |
docs/sql/012_invites.sql |
NUOVO |
docs/sql/013_license_ext.sql |
NUOVO |
docs/sql/reset-demo.sql |
MODIFICATO (super_admin persistente) |
docs/integration/lg231-nis2-integration.md |
NUOVO |
docs/integration/nis2-license-api.postman.json |
NUOVO |
File deployati su Hetzner
Tutti i file sopra tramite git push + git pull. Migrations applicate via SSH/mysql.
URL attivi in produzione
| Risorsa | URL |
|---|---|
| App | https://nis2.agile.software/ |
| Test runner | https://nis2.agile.software/test-runner.php?t=Nis2Test2026 |
| Doc partner (lg231) | https://nis2.agile.software/integrazioniext.html |
| Pannello licenze (mktg) | https://nis2.agile.software/licenseExt.html |
| Doc API marketing | https://nis2.agile.software/mktg-api-doc.html |
| Postman collection | https://nis2.agile.software/nis2-license-api.postman.json |
Prossimi passi consigliati
- mktg-agile: recepire API Key + integrare
POST /api/invites/createnel flusso di acquisto - lg231: leggere
integrazioniext.html+docs/integration/lg231-nis2-integration.mde implementare Nis2Client + provisioning - E-commerce: usare
GET /api/invites/validate?token=per mostrare anteprima piano prima dell'attivazione - Controllo utenti per org: aggiungere check
license_max_usersinOrganizationControllerquando si invitano nuovi utenti - Rinnovo licenze: endpoint
POST /api/invites/{id}/renewche estendelicense_expires_atsull'org
Credenziali importanti (non committare)
- Super admin:
cristiano.benassati@gmail.com/Silvia1978!@ - API Key mktg:
nis2_mktg_8c8bd38e78fccb9faa749d8601051f42(scope: admin:licenses, scade 2028) - SSH Hetzner:
ssh -i docs/credentials/hetzner_key root@135.181.149.254