L'autenticazione a due fattori può sembrare un processo molto banale da parte dell'utente. Molti sono abituati da tempo al fatto che, quando si utilizzano molte applicazioni, non è sufficiente inserire una combinazione di login e password già nota. Per una maggiore sicurezza e per evitare accessi non autorizzati, viene introdotto un ulteriore fattore di verifica. Nella maggior parte dei casi, si tratta di un codice univoco che può essere ricevuto via e-mail o SMS.

In questa esercitazione scopriremo come implementare l'autenticazione a due fattori in AppMaster. Come esempio, si utilizzerà l'invio del codice alla posta elettronica. Analizzeremo quali moduli devono essere collegati, quali impostazioni effettuare, quale processo aziendale creare e come verificare il risultato finale nella pratica.

Innanzitutto, diamo un'occhiata al piano generale. Quali sono le fasi da implementare nel nostro processo aziendale?

  1. Verifica dell'accesso (assicurarsi che l'utente sia effettivamente registrato).
  2. Verifica della correttezza della password.
  3. Invio di un codice di conferma per posta o SMS.
  4. Verifica della pertinenza del codice.
  5. Verifica della correttezza del codice.
  6. Completamento dell'autenticazione.

Fase preparatoria

Prima ancora di iniziare a progettare l'autenticazione a due fattori, nella fase di registrazione dell'utente è necessario accertarsi che:

  • I dati dell'utente devono contenere un'e-mail. Verrà utilizzato per inviare il codice di verifica. L'e-mail viene spesso utilizzata come login, e noi vedremo proprio un esempio di questo tipo.
  • Il login sia unico. Due utenti diversi con lo stesso login non possono esistere nel sistema.

Per la comodità di risolvere questi (e molti altri) compiti, il modulo è installato di default in ogni . Auth è installato per impostazione predefinita in ogni progetto AppMaster. Contiene i modelli di database, i blocchi di processi aziendali e gli endpoint necessari per il loro utilizzo.

auth module

Verifica del login

Il login, la password e il codice di verifica sono utilizzati come parametri di input del processo aziendale. Ma nella prima fase, abbiamo bisogno solo di un login. Sarebbe utile assicurarsi che questo utente esista. È stato registrato e le informazioni al riguardo sono memorizzate nel database.

user check

Per fare questo, il blocco DB: Search User cerca nel database un utente con il login indicato. Assicurarsi di impostare il parametro SearchExact = True per cercare una corrispondenza esatta.

I dati ricevuti vengono passati al blocco Array Element con l'indice 0 (il conteggio parte da zero e l'unico valore trovato corrisponderà sempre all'indice 0 dell'array).

Il blocco Is Null controlla se l'utente è stato effettivamente trovato. E a seconda del risultato (True/False), il blocco If-Else interromperà il processo aziendale con un messaggio di errore (Raise Error ) o lo indirizza ulteriormente.

Controllo della password

In questa fase, è necessario assicurarsi che la password dell'utente sia stata inserita correttamente.

password check

A questo proposito, è essenziale capire che le password non vengono memorizzate esplicitamente nel database. La funzione Bcrypt le sottopone a hash e solo l'hash risultante viene memorizzato nel database. Pertanto, anche se ipotizziamo che si verifichi una fuga di dati, gli aggressori non saranno comunque in grado di trovare le password degli utenti, poiché sono crittografate in modo sicuro.

Per questo motivo, non è possibile ottenere semplicemente la password dal database e confrontarla con la password inserita. È necessario ottenere l'hash della password e utilizzarlo per il confronto. Per risolvere questo problema, viene utilizzato il Auth: Probe Password viene utilizzato. Come parametri di ingresso, prende la password inserita dall'utente (password) e l'hash della password memorizzata nel database (hashed_password) e la converte nel tipo di dati String (il blocco). To String blocco).

A seconda del risultato, come nel passo precedente, utilizzando il blocco If-Else si visualizza un messaggio di errore (Raise Error, Message = Password is wrong) o indirizzare il processo alla fase successiva.

Estensione del modello utente

Per la fase successiva, è necessario apportare una piccola modifica al modello utente e aggiungere informazioni sul codice che deve essere confermato.

In genere, il modello User contiene inizialmente dei campi che possono essere utilizzati per questo compito - Confirmed, Confirmation code, Confirmation code expires at. Ma in questo esempio, assumeremo che questi campi siano utilizzati solo per la registrazione e la verifica iniziale dell'account.

Per una maggiore chiarezza del processo, creiamo un modello twofa (two-factor authentication) separato, associamo a esso il modello User (relazione 1 a 1, has one) e aggiungiamo un campo - code ( tipoString ).

user model

Preparazione all'invio di e-mail

Per inviare le e-mail con i codici di conferma, è necessario preparare una fase preliminare. Una delle opzioni più accessibili è l'uso del modulo Custom SMTP che deve essere installato e configurato.

custom SMTP module

Quando si utilizza Gmail, la maggior parte delle impostazioni è già impostata di default ed è necessario aggiungere il nome utente e la password. Quando si utilizzano altri server di posta, sarebbe utile fare riferimento alla loro documentazione per ottenere i dati necessari.

In questo caso, potrebbe essere necessario modificare leggermente le impostazioni di sicurezza del server di posta. Ad esempio, Gmail potrebbe bloccare per impostazione predefinita le connessioni che utilizzano applicazioni di terze parti; è necessario rimuovere questa restrizione nelle impostazioni.

Invio di un codice di verifica

Abbiamo controllato il login e la password e completato tutti i preparativi necessari, quindi ora si può procedere all'invio di una lettera con un codice di conferma.

send email

Il Custom SMTP: Send Email utilizza un array di indirizzi come destinazione. Pertanto, anche se si deve inviare una lettera a un solo indirizzo, questo deve essere aggiunto all'array. A questo scopo, si utilizza il blocco Append Array viene utilizzato.

Il passo successivo consiste nel generare un codice di verifica. Il blocco Random string è adatto a questo scopo. Invieremo un codice composto da 6 numeri casuali ed effettueremo le impostazioni appropriate. Length = 6, With 0-9 = True, tutti gli altri parametri = False.

Successivamente, è necessario creare il testo della lettera. Per farlo, utilizzare il blocco Concat Strings per aggiungere del testo esplicativo al codice generato (First = Verification code: ), convertire il risultato nel tipo di dati Text (To Text e collegare il risultato al parametro body del blocco di invio dell'e-mail.

Per l'invio finale, non resta che specificare l'oggetto della lettera (subject) e il mittente (from_name).

Ma non basta inviare il codice, occorre anche memorizzarlo nei dati dell'utente. Dopo tutto, è necessario verificarne la correttezza quando l'utente riceve il codice e lo invia come conferma.

save twofa

Per farlo, utilizzeremo il modello twofa, che abbiamo prudentemente creato in precedenza. Se si tratta del primo invio di codice, è necessario crearlo con informazioni sull'utente a cui appartiene. In caso di riutilizzo, è necessario modificare la voce esistente, indicando il suo ID e il nuovo codice.

Il passo finale della fase consiste nell'utilizzare il blocco Raise Error per restituire un messaggio sull'invio del codice all'e-mail.

Controllo della pertinenza del codice

Vale la pena di occuparsi di un'ulteriore sicurezza e di proteggere il codice da una banale enumerazione. Sarebbe opportuno limitare il numero di tentativi di inserimento, la loro frequenza e la durata di vita del codice inviato. Non analizzeremo tutti questi esempi; i requisiti di sicurezza sono individuali per ogni progetto e possono includere molte condizioni diverse. Ci limitiamo a verificare la pertinenza del codice in base al suo periodo di validità.

code lifetime check

Utilizziamo il blocco Current date & time per ottenere l'ora corrente. Collegarlo al parametro B del blocco Date & time difference del blocco. Utilizzeremo il campo UpdatedAt del modello twofa come parametro A.

Come risultato, si ottiene Time span - la differenza tra due punti temporali. Resta solo da verificare se questa differenza supera un certo valore selezionato. Nel nostro esempio, si tratta di 5 minuti, che imposteremo come valore statico B del blocco. Greater blocco.

time span value

Il blocco If-Else utilizzerà il risultato del confronto per guidare ulteriormente il processo. Se True (la differenza supera i 5 minuti), il processo tornerà alla fase di invio della lettera; l'utente riceverà un codice aggiornato. Nel caso in cui False (il codice è fresco e aggiornato), sarà possibile procedere alla verifica di questo codice.

Revisione del codice

La fase finale dell'autenticazione consiste nella verifica del codice ricevuto.

code check

Il blocco Equal deve convalidare che il codice passato dall'utente corrisponda a quello memorizzato nel modello twofa associato all'utente. Se ciò non avviene e il codice è specificato in modo errato (If-Else -> False), è necessario visualizzare un messaggio di errore (Raise Error, Message = Code is wrong). Se il confronto conferma la corrispondenza, si può procedere alla fase finale di autenticazione.

Per farlo, si utilizza il blocco Auth: Authentication e otteniamo le informazioni sull'utente con il suo token di autorizzazione. Le passiamo al blocco End come risultato di un'autenticazione riuscita.

Creare un endpoint

Il processo aziendale è stato creato, ma non è ancora disponibile per l'uso. È necessario creare un endpoint che esegua questo processo aziendale.

2fa endpoint

Una soluzione ragionevole sarebbe quella di utilizzare l'endpoint di autenticazione predefinito (POST /Auth). Sarà sufficiente sostituire il suo processo aziendale e installare quello appena creato. In questo modo, l'autenticazione semplice sarà disabilitata e verrà invece utilizzata l'autenticazione a due fattori.

Pubblicazione e test

Questo completa la creazione dell'autenticazione a due fattori. È possibile pubblicare il risultato e verificarlo in azione. A tale scopo, è conveniente utilizzare Swagger, a cui si accede facendo clic sul nome del piano Deploy nella sezione Project API del pulsante Preview.

project API

Non resta che trovare l'endpoint desiderato nell'elenco, inserire i dati dell'utente e avviare l'esecuzione con il pulsante Execute. Se durante il test si riscontrano errori, tornare al processo aziendale e apportare le modifiche necessarie.

Swagger

Was this article helpful?

AppMaster.io 101 Corso intensivo

10 Moduli
2 settimane

Non sai da dove cominciare? Inizia con il nostro corso intensivo per principianti ed esplora AppMaster dalla A alla Z.

Inizia il corso
Development it’s so easy with AppMaster!

Serve ancora aiuto?

Risolvi qualsiasi problema con l'aiuto dei nostri esperti. Risparmia tempo e concentrati sulla creazione delle tue applicazioni.

headphones

Contatta il Supporto

Parlaci del tuo problema e ti troveremo una soluzione.

message

Chat comunitaria

Discuti le domande con altri utenti nella nostra chat.

Unisciti alla comunità