API Import ed Export Utenti
L’API Import ed Export Utenti consente operazioni massiva sugli utenti per scenari di migrazione, onboarding e backup. Gli amministratori possono importare utenti da file CSV o JSON ed esportare l’intera directory utenti in entrambi i formati.
Le operazioni di importazione vengono elaborate in modo asincrono. Dopo aver caricato un file, il job di importazione avanza attraverso vari stati mentre le righe vengono validate e gli utenti vengono creati. Anche le operazioni di esportazione sono asincrone — una volta completate, il file generato è disponibile per il download per 24 ore.
Importa Utenti
Carica File di Importazione
/api/users/importRequires: manage:usersCarica un file CSV o JSON contenente i record utente da importare. Il file viene validato e viene creato un job di importazione. L’elaborazione avviene in modo asincrono — interroga lo stato del job per monitorare il progresso. Dimensione massima del file: 10MB.
Corpo della richiesta — multipart/form-data
| Campo | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
file | file | Sì | File CSV o JSON (max 10MB). L’estensione del file determina il formato |
Risposta di successo
{
"ok": true,
"data": {
"id": "imp_abc123",
"fileName": "users-batch-2025-02.csv",
"format": "csv",
"status": "PENDING",
"totalRows": 150,
"processedRows": 0,
"successCount": 0,
"errorCount": 0,
"errors": [],
"createdAt": "2025-02-18T10:00:00Z",
"updatedAt": "2025-02-18T10:00:00Z"
}
}Codici di errore
| Codice | HTTP | Descrizione |
|---|---|---|
VALIDATION_ERROR | 400 | File mancante, formato non supportato, supera il limite di 10MB, o file vuoto |
PARSE_ERROR | 400 | Il file non può essere analizzato (CSV malformato o struttura JSON non valida) |
Elenca Job di Importazione
/api/users/importRequires: manage:usersElenca tutti i job di importazione per il tenant. I job sono ordinati per data di creazione decrescente. Usalo per monitorare le importazioni in corso o rivedere la cronologia.
Parametri di query
| Parametro | Tipo | Descrizione |
|---|---|---|
page | integer | Numero di pagina (default: 1) |
limit | integer | Elementi per pagina (default: 20, max: 100) |
Risposta di successo
{
"ok": true,
"data": {
"data": [
{
"id": "imp_abc123",
"fileName": "users-batch-2025-02.csv",
"format": "csv",
"status": "COMPLETED",
"totalRows": 150,
"processedRows": 150,
"successCount": 142,
"errorCount": 8,
"createdAt": "2025-02-18T10:00:00Z",
"updatedAt": "2025-02-18T10:05:00Z"
}
],
"pagination": {
"page": 1,
"limit": 20,
"total": 3,
"totalPages": 1
}
}
}Recupera Dettaglio Job di Importazione
/api/users/import/[id]Requires: manage:usersRecupera informazioni dettagliate su un job di importazione, inclusi i dettagli degli
errori per riga. Interroga questo endpoint mentre status è PENDING o PROCESSING.
Risposta di successo
{
"ok": true,
"data": {
"id": "imp_abc123",
"fileName": "users-batch-2025-02.csv",
"format": "csv",
"status": "COMPLETED",
"totalRows": 150,
"processedRows": 150,
"successCount": 142,
"errorCount": 8,
"errors": [
{
"row": 12,
"email": "[email protected]",
"error": "Email already exists in this tenant"
},
{
"row": 34,
"email": "invalid-email",
"error": "Invalid email format"
},
{
"row": 56,
"email": "[email protected]",
"error": "Role 'super_admin' does not exist"
}
],
"createdAt": "2025-02-18T10:00:00Z",
"updatedAt": "2025-02-18T10:05:00Z"
}
}Codici di errore
| Codice | HTTP | Descrizione |
|---|---|---|
NOT_FOUND | 404 | Il job di importazione non esiste |
Progressione degli Stati
| Stato | Descrizione |
|---|---|
PENDING | File caricato e validato, in attesa di elaborazione |
PROCESSING | Le righe vengono elaborate. processedRows si incrementa ad ogni riga |
COMPLETED | Tutte le righe elaborate con successo (errorCount è 0) |
PARTIAL | Tutte le righe elaborate ma alcune con errori (errorCount > 0, successCount > 0) |
FAILED | Elaborazione completamente fallita (corruzione del file, errore di sistema, o tutte le righe avevano errori) |
Per importazioni di grandi dimensioni (500+ righe), l’elaborazione può richiedere diversi minuti. Interroga l’endpoint di dettaglio ogni 2-3 secondi per monitorare il progresso. Il campo processedRows si aggiorna in tempo reale.
Formati dei File di Importazione
Formato CSV
La prima riga deve essere una riga di intestazione con i nomi delle colonne. L’ordine delle colonne non ha importanza. Le colonne vengono abbinate per nome (senza distinzione tra maiuscole e minuscole).
email,firstName,lastName,roles,password
[email protected],Jane,Doe,editor,SecurePass123!
[email protected],Bob,Smith,"editor,viewer",AnotherPass456!
[email protected],Alice,Johnson,admin,
[email protected],Carol,Williams,,- Più ruoli sono separati da virgole tra virgolette:
"editor,viewer" - Il campo password vuoto significa che l’utente deve usare il magic link o il reset password per impostarne uno
- Il campo ruoli vuoto significa che l’utente viene creato senza ruoli assegnati
Formato JSON
Il file deve contenere un array JSON di oggetti utente al livello principale.
[
{
"email": "[email protected]",
"firstName": "Jane",
"lastName": "Doe",
"roles": ["editor"],
"password": "SecurePass123!"
},
{
"email": "[email protected]",
"firstName": "Bob",
"lastName": "Smith",
"roles": ["editor", "viewer"]
}
]Riferimento Campi
| Campo | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
email | string | Sì | Indirizzo email dell’utente. Deve essere univoco nel tenant |
firstName | string | No | Nome dell’utente |
lastName | string | No | Cognome dell’utente |
roles | string/array | No | Nome/i dei ruoli da assegnare. Devono corrispondere ai ruoli esistenti nel tenant |
password | string | No | Password iniziale. Deve soddisfare i requisiti di policy del tenant |
Le password sono opzionali. Quando omesse, l’account utente viene creato senza password. L’utente deve usare il magic link o il flusso di reset password per impostare la propria password al primo accesso. Questo è l’approccio consigliato per le importazioni massiva.
Gestione degli Errori per Riga
Ogni riga viene elaborata indipendentemente. Se una riga fallisce la validazione, viene saltata e l’errore viene registrato. L’elaborazione continua con le righe rimanenti.
| Errore | Descrizione |
|---|---|
Email is required | Il campo email è mancante o vuoto |
Invalid email format | L’indirizzo email non è sintatticamente valido |
Email already exists in this tenant | Un utente con questa email esiste già |
Role 'X' does not exist | Il nome del ruolo specificato non è stato trovato |
Password does not meet minimum length requirement | La password è più corta del minimo configurato |
Password does not meet complexity requirements | La password non soddisfa i requisiti di complessità |
Esporta Utenti
Avvia Esportazione
/api/users/exportRequires: manage:usersAvvia un’esportazione di tutti gli utenti nel tenant. L’esportazione viene eseguita in modo asincrono — interroga lo stato del job quando il file è pronto per il download.
Corpo della richiesta
{
"format": "csv"
}| Campo | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
format | string | Sì | Formato di output: csv o json |
Risposta di successo
{
"ok": true,
"data": {
"id": "exp_abc123",
"format": "csv",
"status": "PENDING",
"totalUsers": 0,
"createdAt": "2025-02-18T11:00:00Z",
"expiresAt": "2025-02-19T11:00:00Z"
}
}Le password non vengono mai incluse nelle esportazioni. Gli hash delle password sono non reversibili e vengono esclusi per ragioni di sicurezza. Gli utenti esportati importati in un altro tenant dovranno impostare nuove password.
Scarica File di Esportazione
/api/users/export/[id]/downloadRequires: manage:usersScarica il file di esportazione generato. Il file è disponibile per 24 ore dopo il completamento dell’esportazione.
Intestazioni di risposta
Content-Type: text/csv (o application/json)
Content-Disposition: attachment; filename="users-export-2025-02-18.csv"Codici di errore
| Codice | HTTP | Descrizione |
|---|---|---|
NOT_FOUND | 404 | Il job di esportazione non esiste |
NOT_READY | 400 | L’esportazione è ancora in elaborazione |
EXPIRED | 410 | Il file di esportazione è scaduto ed è stato eliminato |
Campi Esportati
| Campo | Colonna CSV | Chiave JSON | Descrizione |
|---|---|---|---|
email | email | Indirizzo email dell’utente | |
| Nome | firstName | firstName | Nome dell’utente |
| Cognome | lastName | lastName | Cognome dell’utente |
| Ruoli | roles | roles | Nomi dei ruoli separati da virgola (CSV) o array di stringhe (JSON) |
| Email Verificata | emailVerified | emailVerified | Se l’email è stata verificata |
| Abilitato | isEnabled | isEnabled | Se l’account è attivo |
| Creato Il | createdAt | createdAt | Timestamp di creazione account (ISO 8601) |
| Ultimo Login | lastLoginAt | lastLoginAt | Timestamp del login più recente (ISO 8601), o vuoto/null |
I file di esportazione scadono dopo 24 ore e vengono eliminati definitivamente. Scarica il file prontamente dopo che la generazione è completata. Puoi sempre avviare una nuova esportazione se necessario.
Flusso di Migrazione
Una tipica migrazione tra tenant segue questo schema:
- Esporta gli utenti dal tenant sorgente tramite
POST /api/users/exportcon formatojson. - Scarica il file di esportazione tramite
GET /api/users/export/[id]/download. - Opzionalmente modifica il file per aggiustare i ruoli o rimuovere utenti.
- Importa il file nel tenant di destinazione tramite
POST /api/users/import. - Monitora il job di importazione tramite
GET /api/users/import/[id]finché lo stato non èCOMPLETEDoPARTIAL. - Esamina eventuali errori a livello di riga nell’array
errors. - Notifica gli utenti importati di impostare le proprie password tramite magic link o reset password (poiché le password non vengono esportate).
Riferimento Permessi
| Permesso | Descrizione |
|---|---|
manage:users | Carica file di importazione, avvia esportazioni, scarica file e visualizza la cronologia dei job |
Le operazioni di import ed export vengono registrate nel log di audit con i tipi di evento user_import.created e user_export.created.
Correlati
- Guida Import ed Export — Procedura guidata di migrazione passo-passo
- Import ed Export Utenti — Esegui importazioni ed esportazioni dalla Console
- API Utenti — Endpoint di gestione utenti individuali
- API SCIM 2.0 — Alternativa di provisioning automatizzato