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.
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.