Sfondo:
Attualmente è in fase di creazione di un'API REST, utilizzando il nodo w / express e viene utilizzato da un'app mobile e infine da un sito Web (basato su browser moderni).
Sto cercando di identificare il modo migliore per autorizzare la richiesta di aggiornamento / azione di un utente in modo che possano modificare solo le proprie risorse. Le azioni si verificheranno a un tasso quasi elevato, quindi la preoccupazione.
Nota: la proprietà delle entità non può essere trasferita in questo caso d'uso.
Soluzioni potenziali:
Soluzione : Archivia e mantieni un elenco delle risorse di ciascun utente in una sessione del server supportato da qualcosa come reddis.
Concern (s) : La persistenza di una sessione lato server ha il proprio insieme di complessità che si adatta in modo specifico a più server. Ciò viola anche il REST. do-session-really-violate-restfulness per ulteriori informazioni.
Soluzione: Esegui una query di lettura prima della query di aggiornamento / azione dell'utente. IE mi danno gli articoli di questo utente, se poi nella sua lista procedere con l'aggiornamento.
Concern (s): Sovraccarico di una lettura aggiuntiva ogni volta che un utente agisce per conto di una risorsa.
Soluzione: Passa l'id utente fino al livello db e rendilo parte del condizionamento dell'aggiornamento o se vuoi avere fantasia usa qualcosa come la sicurezza a livello di riga di Postgres per quella risorsa a seconda del backend dei dati.
Concern (s): Questo sembra un po 'in ritardo nel ciclo di vita della richiesta per verificare se la risorsa è l'utente richiedente. L'errore dovrebbe essere sollevato dal backend dei dati. Sulla stessa nota sarebbe anche un po 'fuori luogo considerando che l'autenticazione e l'autorizzazione basata sui ruoli è spesso fatta all'inizio del ciclo di vita della richiesta. L'implementazione dipende anche dal backend dei dati. Spinge anche la logica aziendale nel backend dei dati.
Soluzione: Sessione firmata lato client di sorta. O con un JWT o un cookie crittografato / firmato. Essenzialmente mantenendo una sessione fidata contenente un elenco degli ID delle risorse dell'utente.
Concern (s): La dimensione della sessione lato client. Il fatto che sarebbe inviato con ogni singola richiesta anche quando non è necessario. La manutenzione diventa estremamente complessa quando si introduce la possibilità di più sessioni / client attivi. Come aggiorneresti lo stato lato client quando una risorsa è stata aggiunta su un altro client.
Soluzione: Passa un token di aggiornamento firmato (JWT) o url al client con la risorsa quando la risorsa viene recuperata. Aspettatevi quando una risorsa viene aggiornata / attivata. Il token firmato conterrebbe l'id utente e l'ID risorsa e potresti facilmente verificarlo.
Concern (s): Diventa complesso se la proprietà delle risorse è trasferibile, ma nel mio caso non è una preoccupazione. Introduce la complessità rispetto a una lettura prima dell'aggiornamento. È un po 'strano?
Considerazioni finali:
Mi sto appoggiando all'ultima soluzione, ma poiché non vedo accadere molto spesso mi chiedo se mi manca qualcosa? o forse fa parte di un modello di progettazione che non conosco.