Gli ID back-end dovrebbero essere pubblici o meno su un'API REST?

10

Basato su ciò che dice questo tizio: link

Supponiamo che abbia ragione sull'uso dell'UUID per identificare le risorse API. Poi mi imbatto in problemi cercando di implementarlo in questo modo, questo è:

class FooEntity {

    final String id = null;  //auto-generated by my backend (mongodb), not shared
    final UUID uid = UUID.randomUUID();  //the resource id
}

(Tra client e server, vengono inviati e ricevuti DTO, non entità di base dati.)

Il problema ora è che id non è utile in quanto non lo sto più utilizzando. Il client effettua le richieste con uid , quindi perché devo preoccuparmi di gestire 2 ID? Quindi torniamo allo stesso numero dell'inizio. Se imposto l'UUID come chiave primaria ( _id ), espongo l'ID back-end al pubblico.

Accanto a ciò, c'è l'argomento dell'efficienza. Ho letto che l'indicizzazione di ObjectId è molto più efficiente di UUID.

    
posta anat0lius 11.04.2017 - 12:42
fonte

3 risposte

7

I'm exposing the backend id to the public

Quali altri mezzi devi identificare le tue entità quando vengono restituite attraverso una richiesta? Questo è perfettamente legittimo e più sicuro di SSN o identificatori simili. Questo è ciò di cui parla Todd: rendere le identificazioni tecnologiche e l'entità neutrali e ha ragione.

Efficiency topic

Puoi mantenere entrambi gli identificatori se ObjectId è davvero molto più efficiente. In teoria è sempre meglio utilizzare gli UUID per gli identificatori rispetto agli incrementatori automatici del database.

    
risposta data 11.04.2017 - 13:10
fonte
5

No, per quanto riguarda il database, nulla sulla struttura interna è esposto all'API esterna. Gli ID non hanno intelligenza. Non sono nemmeno unici nel mondo reale. ID: 47 è ovunque. Ci sono entità a cui puoi accedere e che possibilmente possono manipolare i dati, ma se questo database memorizza tutto in una tabella o dieci, usa ID incrementale come PK e si riferisce a un FK, non lo saprai mai.

Se riesci a GetUserAccountByID (12345), chiedi a qualcuno di provare GetUserAccountByID (12346). Anche se non funzionerà a causa di altre misure di sicurezza, non provarci nemmeno e non provare a socializzare la società chiedendo informazioni su Account: 12346. A meno che non chiami il DBA e sei disposto ad aspettare 2 settimane per un reponse;)

Quindi crea i GUID come ritieni opportuno o qualsiasi altra chiave naturale come un numero di telefono o un indirizzo email. Metti un vincolo univoco sul campo nella tabella per evitare qualche oscuro tentativo di copia e incolla in alcuni tentativi di unione dei dati.

Questo non è ridondante. I due campi hanno scopi diversi.

    
risposta data 11.04.2017 - 17:50
fonte
0

Informazioni su ID efficienza vs UUID, a meno che tu non abbia più join che coinvolgono più tabelle ciascuno con milioni di record, questo non farà molta differenza. L'utilizzo dell'UUID rende la tua applicazione molto più difficile da demolire se non si controlla / si applica direttamente sul lato server .:

  • RICEVI [...] / 1
  • RICEVI [...] / 2

È molto semplice quando si usa l'ID, se si utilizza UUID invece, è un'opzione in meno per uno scrapper.

L'ID può essere visto come qualcosa all'interno dell'istanza del database dell'applicazione. Ci sono tre parole importanti in quella frase:

  • Applicazione: poiché è il tuo modello, è probabile che le tue tabelle vengano utilizzate solo da quell'applicazione
  • Database: se più applicazioni lo utilizzavano contro lo stesso database, stai andando bene
  • Istanza (del database): se si dispone di un sistema distribuito, l'id sarà in conflitto tra loro e sarebbe priva di significato per qualsiasi altro sistema / applicazione che non utilizza l'istanza del database. UUID è la soluzione per quel caso specifico.

Per preferenze personali: preferisco avere un ID semplice e un ID aziendale univoco (posta, accesso, ...). Quindi, se devo scambiare dati, userò l'ID aziendale, perché il sistema di destinazione potrebbe non gestire l'UUID, ma molto probabilmente (mai dire mai ...) gestirà bene una chiave aziendale univoca.

    
risposta data 11.04.2017 - 15:11
fonte

Leggi altre domande sui tag