Claim JWT Personalizzati
I claim personalizzati consentono di incorporare dati aggiuntivi direttamente nel JWT access token emesso da Auris. Invece di effettuare una chiamata API separata per recuperare i dati utente dopo l’autenticazione, il tuo backend può leggere il claim direttamente dal token verificato.
I claim personalizzati vengono configurati per applicazione nella Console e risolti al momento dell’emissione del token.
Quando Usare i Claim Personalizzati
I claim personalizzati sono utili quando:
- Il tuo backend ha bisogno di metadati utente (dipartimento, piano, tenant ID) su ogni richiesta senza una ricerca aggiuntiva
- Un’API di terze parti si aspetta claim specifici nel JWT (es. un gateway di pagamento che si aspetta un claim
subscription_tier) - Vuoi codificare informazioni su permessi o ruoli nel token per un’autorizzazione stateless
- Diverse applicazioni nel tuo tenant necessitano di dati utente diversi nei loro token
I claim negli access token sono leggibili da chiunque detenga il token. Non incorporare dati sensibili (password, segreti, dati finanziari) nei claim JWT. I claim sono inclusi anche nella dimensione del token — payload di grandi dimensioni aumentano la dimensione di ogni header HTTP Authorization.
Tipi di Claim
Auris supporta quattro tipi di valori per i claim:
STATIC
Un valore stringa, numerico o booleano fisso — lo stesso per ogni utente che riceve un token da questa applicazione.
{ "environment": "production" }
{ "app_version": "2.1.0" }
{ "feature_flag_x": true }Usa quando: Devi identificare quale applicazione ha emesso il token, o incorporare valori di configurazione che non cambiano per utente.
USER_ATTRIBUTE
Un valore derivato dal profilo dell’utente autenticato. Gli attributi disponibili sono:
| Chiave Attributo | Descrizione |
|---|---|
email | Indirizzo email principale dell’utente |
firstName | Nome dell’utente |
lastName | Cognome dell’utente |
username | Username dell’utente |
phoneNumber | Numero di telefono verificato dell’utente |
metadata | L’intero oggetto JSON dei metadati utente |
metadata.{key} | Una chiave specifica dal JSON dei metadati utente |
{ "user_email": "[email protected]" }
{ "department": "engineering" } // tramite metadata.department
{ "phone": "+39 333 1234567" }Usa quando: Il tuo backend o servizio downstream ha bisogno dei dati di identità utente disponibili nel token senza chiamate API aggiuntive.
ROLE_BASED
Un valore diverso restituito in base ai ruoli che l’utente possiede. Il primo ruolo corrispondente vince. Un valore di fallback viene restituito se nessun ruolo corrisponde.
// Configurazione:
{
"plan": {
"Amministratore": "enterprise",
"Utente Pro": "pro",
"default": "free"
}
}
// Claim risultante per un Utente Pro: { "plan": "pro" }
// Claim risultante per un Amministratore: { "plan": "enterprise" }
// Claim risultante per un utente senza ruolo corrispondente: { "plan": "free" }Usa quando: Ruoli diversi nel tuo sistema corrispondono a livelli di funzionalità, livelli di accesso o piani tariffari su cui i servizi downstream devono agire.
EXPRESSION
Un valore calcolato usando una semplice espressione valutata nel contesto utente. Le espressioni hanno accesso alle variabili user, roles e metadata.
// Le espressioni sono simili a JavaScript (valutate in un contesto sandbox)
user.email.split('@')[1] // => "acme.com" (dominio email)
roles.includes('Amministratore') // => true | false
metadata.orgId ?? 'default' // => orgId dai metadati o "default"
user.firstName + ' ' + user.lastName // => "Mario Rossi"Le espressioni vengono valutate in un contesto sandbox. Non hanno accesso a require, import, process, eval, chiamate di rete o operazioni sul file system.
Usa quando: Hai bisogno di un valore derivato o calcolato che non è direttamente disponibile come attributo utente.
Claim Riservati
Le seguenti chiavi di claim sono riservate da Auris e dalla specifica OAuth2/OIDC. Non possono essere sovrascritte dai claim personalizzati:
| Claim Riservato | Descrizione |
|---|---|
iss | Emittente del token (il tuo dominio Auris) |
sub | Subject — l’ID dell’utente |
aud | Audience — il tuo client ID |
exp | Timestamp di scadenza |
iat | Timestamp di emissione |
jti | JWT ID (identificatore univoco del token) |
type | Tipo di token (user o m2m) |
scope | Scope OAuth concessi |
roles | Array dei nomi dei ruoli dell’utente |
email | Email dell’utente (dai claim standard OIDC) |
name | Nome visualizzato dell’utente |
Tentare di creare un claim personalizzato con una chiave riservata restituisce un errore di validazione.
Configurazione nella Console
Apri la configurazione Custom Claims
Nella Console Auris, vai su Applicazioni → seleziona la tua applicazione → scheda Custom Claims.
Aggiungi un claim
Clicca Aggiungi Claim e configura:
- Claim Key: La chiave JSON nel token (es.
department,plan,tenant_id) - Tipo Claim: STATIC, USER_ATTRIBUTE, ROLE_BASED o EXPRESSION
- Valore: Configurazione del valore specifica per tipo
Anteprima del claim
Usa il pulsante Anteprima per risolvere il claim per un utente specifico prima di salvare. Questo chiama l’endpoint API di anteprima con i dati reali dell’utente.
Attiva il claim
Attiva il toggle Attivo sul claim. I claim disattivati vengono saltati durante l’emissione del token (utile per testare senza eliminare la configurazione).
Esempi
Esempio 1: Incorporare il Dipartimento dell’Utente
Requisito: Il tuo backend deve conoscere il dipartimento dell’utente su ogni richiesta.
Configurazione:
- Claim Key:
department - Tipo:
USER_ATTRIBUTE - Attributo:
metadata.department
Token risultante:
{
"sub": "user-id-123",
"email": "[email protected]",
"roles": ["Dipendente"],
"department": "Engineering",
...claim standard...
}Utilizzo nel backend:
// Nessuna chiamata API aggiuntiva — il dipartimento è già nel token
const { department } = verifyToken(req.headers.authorization.slice(7))
console.log(department) // "Engineering"Esempio 2: Badge Piano di Abbonamento
Requisito: Uno strumento di analytics di terze parti si aspetta un claim subscription_plan che indica il livello dell’utente.
Configurazione:
- Claim Key:
subscription_plan - Tipo:
ROLE_BASED - Mapping:
Cliente Enterprise→enterpriseCliente Pro→proPiano Gratuito→free- Default →
free
Token risultante per un Cliente Enterprise:
{
"sub": "user-id-456",
"roles": ["Cliente Enterprise", "Visualizzatore Fatture"],
"subscription_plan": "enterprise",
...
}Esempio 3: Estrazione del Dominio Email
Requisito: Un backend multi-tenant instrada le richieste in base al dominio email dell’utente (azienda).
Configurazione:
- Claim Key:
email_domain - Tipo:
EXPRESSION - Espressione:
user.email.split('@')[1]
Token risultante:
{
"sub": "user-id-789",
"email": "[email protected]",
"email_domain": "contoso.com",
...
}Esempio 4: Ambiente Applicazione Statico
Requisito: Distinguere i token dall’applicazione di produzione rispetto a quella di staging.
Configurazione (sull’app di produzione):
- Claim Key:
env - Tipo:
STATIC - Valore:
production
Configurazione (sull’app di staging):
- Claim Key:
env - Tipo:
STATIC - Valore:
staging
Endpoint API
/api/applications/:id/custom-claimsRequires: view:applicationsElenca tutti i claim personalizzati configurati per un’applicazione, inclusi tipo, configurazione del valore e stato di attivazione.
/api/applications/:id/custom-claimsRequires: manage:applicationsCrea un nuovo claim personalizzato. Corpo: { claimKey: string, valueType: 'STATIC' | 'USER_ATTRIBUTE' | 'ROLE_BASED' | 'EXPRESSION', staticValue?: string, userAttribute?: string, roleMapping?: Record<string, string>, expression?: string, isActive?: boolean }.
/api/applications/:id/custom-claims/:claimIdRequires: manage:applicationsAggiorna la configurazione o lo stato di attivazione di un claim personalizzato.
/api/applications/:id/custom-claims/:claimIdRequires: manage:applicationsElimina un claim personalizzato. I token emessi dopo l’eliminazione non conterranno il claim. I token emessi prima dell’eliminazione rimangono invariati fino alla loro scadenza.
/api/applications/:id/custom-claims/previewRequires: view:applicationsAnteprima della risoluzione del claim per un utente specifico. Corpo: { userId: string }. Restituisce i valori del claim risolti come apparirebbero in un token per quell’utente.
Considerazioni sulla Dimensione del Token
Ogni claim personalizzato si aggiunge alla dimensione di ogni JWT access token emesso dall’applicazione. I token JWT vengono inviati come header HTTP su ogni richiesta autenticata. Mantieni i claim concisi:
| Considerazione | Indicazione |
|---|---|
| Valori stringa | Mantieni sotto i 100 caratteri per claim |
| Evita oggetti metadata completi | Usa metadata.{key} per estrarre campi specifici, non l’intero oggetto metadata |
| Numero di claim | Punta a meno di 10 claim personalizzati per applicazione |
| Valori dei claim basati su ruoli | Usa identificatori brevi (pro, free) non descrizioni complete |
Token troppo grandi possono causare errori 431 Request Header Fields Too Large su alcuni proxy e load balancer (tipicamente con header superiori a 8KB).
Guide Correlate
- Ruoli e Permessi (RBAC) — Configurazione dei ruoli referenziata dai claim ROLE_BASED
- Autorizzazione Granulare (FGA) — Autorizzazione a livello di oggetto usando FGA
- Client Credentials M2M — I claim personalizzati si applicano anche ai token M2M