Authentication Service

Contenuti


Descrizione

L’Authentication Service è un servizio che gestisce la registrazione e l’autenticazione degli utenti all’interno di un’applicazione.

Implementazione

L’implementazione dell’Authentication Service è descritta dal seguente diagramma delle classi UML.

Authentication Service Class Diagram

Come si può vedere dal diagramma, l’implementazione del servizio dipende dal framework HexArc.

In particolare, il servizio definisce due componenti principali:

  • AuthenticationPort: definisce le funzionalità del servizio.
  • AuthenticationHttpAdapter: espone alcune delle funzionalità dell’AuthenticationPort attraverso un contratto di tipo REST, disponibile al seguente link.

Le funzionalità definite dall’AuthenticationPort sono le seguenti:

  • registerUser: registra un nuovo utente nel servizio;
  • loginUser: autentica un utente nel servizio, assegnandogli un nuovo token;
  • revokeToken: revoca il token di un utente e quindi la sua autenticazione nel servizio;
  • getUserInformation: restituisce le informazioni relative a un utente del servizio;
  • updatePassword: aggiorna la password di un utente del servizio;
  • validateToken: verifica la validità del token fornito da uno specifico utente del servizio.

Tali funzionalità sono definite nei termini dei concetti del dominio del servizio. In particolare, i modelli relativi a tali concetti sono i seguenti:

  • User: modella un utente del servizio;
  • Token: modella il token assegnato a un utente autenticato del servizio;
  • UserSession: modella la sessione di un utente autenticato del servizio.

L’implementazione dell’AuthenticationPort è modellata dall’AuthenticationModel. L’AuthenticationModel gestisce la persistenza dei dati nel servizio attraverso una PersistentCollection e per comunicare con la PersistentCollection utilizza il linguaggio delle query MongoDBQueryLanguage. Quindi, implementa tutte le funzionalità dell’AuthenticationPort attraverso delle opportune query.

L’AuthenticationHttpAdapter e l’AuthenticationModel possono generare delle eccezioni, modellate dalla classe AuthenticationServiceException. In particolare, l’utente che utilizza il servizio potrebbe essere notificato delle seguenti AuthenticationServiceException:

  • IncorrectPasswordException: indica all’utente che la password da lui specificata per autenticarsi non è corretta;
  • MalformedInputException: indica all’utente che l’input specificato per una certa funzionalità da lui richiesta non è corretto;
  • TokenExpiredException: indica all’utente che la funzionalità da lui richiesta necessita di essere autenticati, ma il suo token è scaduto;
  • UsernameAlreadyTakenException: indica all’utente che il nome utente da lui specificato per registrarsi all’applicazione è già stato riservato da un altro utente;
  • UserNotAuthorizedException: indica all’utente che la funzionalità da lui richiesta necessita di essere autenticati, ma il suo token non esiste o non gli fornisce i permessi necessari;
  • UserNotFoundException: indica all’utente che il nome utente da lui specificato non è associato a nessun dato nel sistema.

Verifica

Per verificare il sistema, è stata creata una suite di test manuali su Postman, in modo da accertarsi che tutte le funzionalità esposte dal contratto REST del servizio producessero i risultati attesi.

In futuro, si dovrà creare degli unit test equivalenti, ma automatici. Per fare ciò, sarà necessario approfondire come creare un database MongoDB di tipo in-memory in Scala.

Esecuzione

Per eseguire il sistema è disponibile un jar al seguente link.

Per eseguire il jar è sufficiente utilizzare il seguente comando:

java -jar authentication-service-<version>.jar \
--mongodb-connection MONGODB_CONNECTION_STRING

In particolare, il jar permette di specificare i seguenti argomenti a linea di comando:

  • --mongodb-connection MONGODB_CONNECTION_STRING: obbligatorio. Permette di specificare la stringa (MONGODB_CONNECTION_STRING) per connettersi all’istanza di MongoDB che sarà utilizzata dal servizio per memorizzare i propri dati.
  • --mongodb-database DATABASE_NAME: opzionale. Permette di indicare il nome del database (DATABASE_NAME) all’interno dell’istanza di MongoDB specificata in cui il servizio memorizzerà i propri dati. Default: authentication.
  • --mongodb-collection COLLECTION_NAME: opzionale. Permette di indicare il nome della collezione (COLLECTION_NAME) all’interno del database MongoDB specificato in cui il servizio memorizzerà i propri dati. Default: users.
  • --http-host HOST: opzionale. Permette di indicare il nome dell’host (HOST) su cui sarà esposto il contratto REST del servizio. Default: localhost.
  • --http-port PORT: opzionale. Permette di indicare la porta dell’host (PORT) su cui sarà esposto il contratto REST del servizio. Default: 8080.
  • --allowed-origins ORIGIN_1;ORIGIN_2;...;: opzionale. Permette di indicare una lista dei siti web che saranno autorizzati a comunicare con il servizio. Tale lista consiste in una sequenza di URL separati da ;. Default: nessun sito web autorizzato.

In alternativa, un’immagine per eseguire il jar è stata pubblicata anche su Docker. Per eseguire il servizio tramite Docker è sufficiente utilizzare il seguente comando:

docker run -it -p 8081:8080 jahrim/io.github.jahrim.chess.authentication-service:<version> \
--mongodb-connection MONGODB_CONNECTION_STRING \
--http-host 0.0.0.0 \
--http-port 8080

Dopodiché, il servizio è accessibile al seguente URL: http://localhost:8081.