Contesto
Consideriamo un'applicazione web standard per la gestione delle auto. Ogni macchina ha un proprietario. Quindi la struttura dell'automobile assomiglia a:
cars(
id INTEGER PRIMARY KEY,
...
owner_id *???*
)
Per ragioni di semplicità, sto utilizzando un Identity Management esterno, nel mio caso Auth0 . La mia domanda è "come rappresentare gli utenti in un database quando esternalizzi completamente Identity Management?" . Tutte le informazioni relative al profilo utente (come le informazioni personali) sono gestite dall'IDM di terze parti.
Opzione 1: mappatura degli utenti locali rispetto agli utenti esterni
Viene creata una tabella User
locale:
users(
id INTEGER PRIMARY KEY, -- local user id
external_id TEXT, -- id in the third party IDM
)
Quindi, Car
è mappato all'ID utente locale:
cars(
id INTEGER PRIMARY KEY,
...
owner_id INTEGER FOREIGN KEY REFERENCES users(id)
)
Pro
- Imponi la coerenza dei dati: l'auto non può essere assegnata a un utente inesistente
- In caso di modifica IDM, solo la tabella
users
deve essere rimappata
Contro
- Il back-end deve catturare l'evento di iscrizione per archiviare l'id esterno nel suo database
- Dopo l'autenticazione, l'IDM esterno deve inviare le informazioni OK, external_id XXX è autenticato, il suo ID locale è YYY .
- il database / back-end deve sapere quando viene creato un nuovo utente
- Tipo di duplicazione delle informazioni sull'ID utente
Opzione 2: usa l'ID esterno
users
tabella non viene creata e cars
proprietà è definita da:
cars(
id INTEGER PRIMARY KEY,
...
owner_id TEXT NOT NULL -- the ID in the external IDM
)
Pro:
- Il back-end è completamente libero dalla gestione delle identità (nuovo utente, login, password dimenticata ...)
- dopo l'autenticazione, se si utilizza JWT, è possibile utilizzare l'ID fornito dall'IDM esterno e non c'è alcuna mappatura da fare
Contro:
- IDM-dipendente. Ho notato che su Auth0, anche l'ID utente social dipende dal tuo tenant, quindi se un nuovo tenant viene usato o peggio, il provider IdaaS cambia, è necessario eseguire molte modifiche.
- L'integrità dei dati non è garantita per la proprietà dell'automobile poiché non esiste un modo per impostare un vincolo a livello di database
Le mie conoscenze
Vorrei andare per l'opzione 1 perché il mio OCD chiedeva l'integrità dei dati, ma l'opzione 2 esiste da qualche parte in questo mondo?