Autenticazione WebAPI

,

Vorrei allargare alla Cummunity una discussione nata in azienda.

Nello specifico abbiamo un’applicazione web cloud per smartphone, che deve poter utilizzare dati e logiche di una applicazione web foundation.
Per ottenere questo risultato, nell’applicazione foundation creiamo delle classi do con il servizio web api attivo, estendendo le classi do usate dall’applicazione foundation stessa. In questo modo, aggiungiamo un layer web api nell’applicazione foundation che utilizza la do già presente ma non ne intacca in alcun modo il funzionamento. Fatto questo, importiamo nel progetto dell’applicazione cloud le classi esposte dall’applicazione foundation.

Non basta, nell’applicazione foundation, il layer così creato deve poter essere usato da qualunque altra applicazione che necessità web api, in questo modo ottengo il risultato di aprire l’applicazione foundation ad usi futuri. Detto in altri termini, le web api dell’applicazione foundation dovranno essere strutturate e funzionare indipendentemente dall’applicazione cloud, e non a suo esclusivo uso e consumo. Sarà l’applicazione cloud ad adeguarsi alle web api dell’applicazione foundation, così come qualsiasi altra applicazione vorrà usare quelle web api.
Quindi, l’applicazione foundation, nel Global Document Web API, esegue la verifica dei dati di autenticazione passati nell’header della richiesta. Una porta unica, in cui viene chiesta la parola chiave prima di poter entrare ed avanzare qualsiasi richiesta.

L’applicazione cloud prevede una UI con login, che chiama un metodo esposto in web api dell’applicazione foundation per la verifica delle credenziali utente. In questo caso, abbiamo quindi due livelli di verifica:

  1. La parola chiave richiesta dalle WebAPI
  2. Il login dell’utente

E qui nasce la discussione, in che modo facciamo convivere le due?

La prima idea è far confluire entrambe nella seconda, creando nell’applicazione foundation un utente “richiesta web api” con username e password. Se la richiesta web api proviene da un utente, nell’evento Global Document Web API eseguirò la verifica delle credenziali di quell’utente. Se la richiesta proviene da un’applicazione generica, nell’evento Global Document Web API eseguirà la verifica delle credenziali dell’utente “richiesta web api”.

La seconda idea è mantenerle separate, memorizzando nell’applicazione cloud la parola chiave che verrà usata nella verifica delle credenziali a livello di web api, e poi un ulteriore metodo login che verifica, se necessario, le credenziali dell’utente che vuole eseguire accesso.

La terza è un insieme delle prime due: la web api verifica la parola chiave e non le credenziali utente (come nella seconda soluzione), il metodo login “bypassa” questa verifica, esegue la verifica delle credenziali utente e, se positiva, ritorna la parola chiave che le altre richieste web api dovranno utilizzare.

Secondo voi, quale delle tre soluzioni è la migliore, in termini di flessibilità e scalabilità?

2 Mi Piace

Ciao Riccardo, provo a risponderti in base alla nostra esperienza sperando di aver compreso il tuo obiettivo.
Noi abbiamo separato il layer logico di autenticazione ovvero la “login” dal layer di security ovvero di “autenticazione” per l’utilizzo delle api in modo da essere flessibili nell’utilizzo ma soprattutto per poter consumare le api anche prima del login per esempio per configurare l’applicazione. Tipicamente mi sento di consigliarti di gestire la sicurezza con un token di autenticazione fisso, dinamico, oauth2, a te la scelta da utilizzare in tutte le chiamate e poi solo per quelle che necessitano di una profilazione per utente puoi passare l’identificativo dell’account nella webapi per comportarsi nel modo desiderato.
ciao

3 Mi Piace

Yes, grazie.
Il mio cruccio è: nel caso in cui il metodo chiamato preveda l’identificazione di un utente, voi passate sia il token per l’utilizzo delle WebAPI sia le credenziali dell’utente? Non vedo un reale vantaggio a fare così.
Piuttosto, volendo mantenere il passaggio dei dati di autenticazione nel header Authorization, permetto a chi mi chiama di passarmi il token WebAPI o il login di un utente, accettandoli entrambi.
Poi sta al singolo metodo chiamato segnalare errore, nel caso in cui abbia bisogno di un utente e invece che il login utente è stato passato il token generico.
Oppure ci sono altri aspetti che non sto valutando?

Cmq grazie, non sono cose così ovvie e immagino che ognuno adotti approcci differenti :slight_smile: