Autenticazione utente del server REST

5

Quindi sto creando la mia prima applicazione su più larga scala (su larga scala intendo qualcosa che mi vedo pubblicare nell'app store) e non sono sicuro di come gestire l'autorizzazione dell'utente. Il client sarà costituito da un'applicazione per android e iphone e farà richieste HTTP su un server.

I miei dati sono memorizzati in un server PostgreSQL e ho già implementato in modo che un utente possa accedere, ma in questo momento l'accesso non significa praticamente nulla. Quando si esegue una query nel database, non viene effettuato alcun controllo per assicurarsi che i dati richiesti o che si desidera modificare siano tuoi.

Stavo pensando che quando un utente effettua il login riceve un token. Ogni volta che una richiesta viene effettuata su un ID utente, l'host che richiede questi dati dovrebbe anche fornire quel token ID.

Le query sono fatte con chiamate di resto, e di solito sono nella forma [id di utente, nuovi dati 1, nuovi dati 2, nuovi dati 3], e questi nuovi dati saranno inseriti in una tabella, e la nuova riga sarà avere una relazione con l'id del cliente.

I dati che immagazzino non sono in alcun modo sensibili. La maggior parte delle richieste sarà un utente che desidera aggiungere una riga a una tabella nel mio database. La parte più sensibile delle informazioni sarebbe probabilmente l'email di un utente, quindi questo sistema di autenticazione sarebbe presente solo per garantire che nessuno inserisca troll-data su un client diverso da loro.

Un altro punto che non sono sicuro di come gestire è cosa fare quando il token scade. Non posso richiedere all'utente di accedere ogni poche ore, il token dovrebbe essere rinnovato automaticamente. È normale memorizzare id / pass sul client e fare la richiesta automaticamente?

    
posta Rewbert 01.06.2016 - 21:17
fonte

2 risposte

2

Innanzitutto, l'approccio token sembra valido per il tuo caso. Un'opzione è quella di crittografare le informazioni dell'utente (ad es. Id) nel token. Dal lato server, puoi quindi mantenere le cose senza stato. Renditi conto che, a prescindere dai dettagli di come viene generato, questo token è sensibile. Se qualcuno lo ha, possono usarlo per fingere di essere quell'utente finché è valido (proprio come un id di sessione.)

Fino all'ultima parte, non è chiaro quale sia il requisito di accesso. Dici che non vuoi che debbano fare il login ogni poche ore. Quante volte si desidera che debbano effettuare il login ed è basato sull'inattività? Non consiglierei di memorizzare le credenziali poiché altre applicazioni sul dispositivo potrebbero potenzialmente recuperare le credenziali.

    
risposta data 02.06.2016 - 18:15
fonte
1

Non conosco davvero il caso di utilizzo completo, ma questo mi urla davvero usando una sessione. Normalmente questi sono implementati con un ID univoco inviato al client sotto forma di cookie e memorizzato sul server in un database in memoria come redis o memcached .

Quando un utente registra un nuovo oggetto verrà aggiunto a redis e memorizzato da una chiave univoca con tutte le informazioni utente necessarie, un tempo di scadenza può essere impostato anche qui. L'impostazione di una scadenza rimuoverà automaticamente una chiave dalla cache che renderà la sessione di un utente non valida se ha superato la data di scadenza. Per il tuo caso probabilmente memorizzerebbe solo l'id utente, potrebbe anche essere usato per memorizzare qualsiasi altro dato statico comunemente usato che non debba essere interrogato ogni volta.

Poiché le informazioni sulla sessione sono utili sulla maggior parte degli endpoint, un filtro di livello superiore viene normalmente implementato per interrogare redis per la chiave e memorizzare le informazioni dell'utente sulla richiesta prima che venga eseguita qualsiasi logica handler . Se la chiave non esiste, nella risposta potrebbe essere inviato uno stato di 403 .

Tutto dipende da quale tecnologia lato server stai usando, ma questo schema è molto comune e potrebbe già essere implementato nel framework che stai utilizzando. Ad esempio, ho scritto un pseudo codice in pochi minuti che usa express e il loro oggetto di sessione redis . Solo con poche righe di codice fornisce supporto per la scadenza delle sessioni e sicurezza dei dati dell'utente.

    var session = require('express-session');
var RedisStore = require('connect-redis')(session);

//this is middleware provided by the library which will query 'redis'
// from the request cookie, add the session to the request data and
//update the expiry with user activity.
app.use(session({
    store: new RedisStore({ttl: 10000000}),
    secret: 'keyboard cat'
}));

app.post('login', function(req, resp) {
    var sessionData = doLogin(req);
    //store the session data on the request if login is successful
    if(sessionData) {
        req.session = sessionData;
    }

    resp.send(200);
});

app.post('insert', function(req, resp) {
     var userId = req.session && req.session.userId;
     // use the session data to validate the user
     if(userId) {
        doInsert(req);
        resp.send(200);
     }
     else {
        resp.send(403);
     }
}); 

Solo una nota a margine, normalmente un api non dovrebbe prendere l'utente come parametro per manipolare i dati per un utente in quanto è molto incline all'hacking. Memorizzando le informazioni dell'utente su una sessione e facendo sempre riferimento alle informazioni dell'utente si evita qualsiasi manipolazione non autorizzata dei dati dell'utente.

    
risposta data 02.06.2016 - 17:12
fonte

Leggi altre domande sui tag