Die Zwei-Faktor-Authentifizierung kann auf den ersten Blick wie ein sehr banaler Vorgang für den Benutzer erscheinen. Viele haben sich längst daran gewöhnt, dass es bei der Nutzung vieler Anwendungen nicht ausreicht, eine bekannte Kombination aus Login und Passwort einzugeben. Ein zusätzlicher Verifizierungsfaktor wird eingeführt, um die Sicherheit zu erhöhen und unbefugten Zugriff zu verhindern. In den meisten Fällen handelt es sich dabei um einen eindeutigen Code, der per E-Mail oder SMS empfangen werden kann.
In diesem Tutorial lernen wir, wie Sie die Zwei-Faktor-Authentifizierung in AppMaster implementieren können. Als Beispiel wird das Senden des Codes per E-Mail verwendet. Wir werden analysieren, welche Module verbunden werden müssen, welche Einstellungen vorzunehmen sind, welcher Geschäftsprozess zu erstellen ist und wie man das fertige Ergebnis in der Praxis überprüft.
Werfen wir zunächst einen Blick auf den allgemeinen Plan. Welche Schritte müssen in unserem Geschäftsprozess implementiert werden?
- Überprüfung der Anmeldung (Sicherstellen, dass der Benutzer tatsächlich registriert ist).
- Prüfen, ob das Passwort korrekt ist.
- Zusendung eines Bestätigungscodes per Post oder SMS.
- Überprüfung der Relevanz des Codes.
- Überprüfung der Korrektheit des Codes.
- СAbschluss der Authentifizierung.
Vorbereitungsphase
Noch bevor Sie mit der Entwicklung der Zwei-Faktor-Authentifizierung beginnen, müssen Sie in der Phase der Benutzerregistrierung sicher sein, dass:
- Die Benutzerdaten müssen eine E-Mail enthalten. Sie wird für den Versand des Verifizierungscodes verwendet. Die E-Mail wird oft als Login verwendet, und wir werden uns ein solches Beispiel ansehen.
- Das Login ist eindeutig. Es können nicht zwei verschiedene Benutzer mit demselben Login im System existieren.
Zur Erleichterung der Lösung dieser (und vieler anderer) Aufgaben ist das Modul Auth Modul standardmäßig in jedem AppMaster Projekt installiert. Es enthält die notwendigen Datenbankmodelle, Geschäftsprozessblöcke und Endpunkte für deren Verwendung.
Überprüfung des Logins
Login, Passwort und Verifizierungscode werden als Eingabeparameter für den Geschäftsprozess verwendet. In der ersten Phase benötigen wir jedoch nur ein Login. Es wäre hilfreich, sich zu vergewissern, dass dieser Benutzer existiert. Er wurde registriert, und die Informationen darüber sind in der Datenbank gespeichert.
Um dies zu tun, sucht der DB: Search User Block nach einem Benutzer mit dem angegebenen Login in der Datenbank suchen. Stellen Sie sicher, dass Sie den SearchExact = True Parameter so einstellen, dass nach einer exakten Übereinstimmung gesucht wird.
Die empfangenen Daten werden an den Array Element Block mit dem Index 0 übergeben (die Zählung beginnt bei Null, und der einzige gefundene Wert entspricht immer dem Index 0 im Array).
Der Is Null Block prüft, ob der Benutzer tatsächlich gefunden wurde. Und je nach dem Ergebnis (True/False) wird der If-Else Block entweder den Geschäftsprozess mit einer Fehlermeldung unterbrechen (Raise Error Block) oder leitet ihn weiter.
Überprüfung des Passworts
In dieser Phase muss sichergestellt werden, dass das Passwort des Benutzers korrekt eingegeben wurde.
Dabei ist es wichtig zu verstehen, dass Passwörter nicht explizit in der Datenbank gespeichert werden. Die Funktion Bcrypt Funktion hasht sie, und nur der resultierende Hash wird in der Datenbank gespeichert. Selbst wenn wir davon ausgehen, dass es zu einem Datenleck kommt, können Angreifer daher die Kennwörter der Benutzer nicht finden; sie sind sicher verschlüsselt.
Aus diesem Grund kann man nicht einfach das Passwort aus der Datenbank holen und mit dem eingegebenen Passwort vergleichen. Sie müssen den Hash des Kennworts abrufen und für den Vergleich verwenden. Um dieses Problem zu lösen, wird der Auth: Probe Password Block verwendet. Als Eingabeparameter nimmt er das vom Benutzer eingegebene Kennwort (password) und den in der Datenbank gespeicherten Hash des Kennworts (hashed_password) und konvertiert sie in den Datentyp String (den To String Block).
Je nach Ergebnis wird, wie im vorherigen Schritt, mit dem If-Else Block entweder eine Fehlermeldung angezeigt (Raise Error, Message = Password is wrong) oder leiten den Prozess zum nächsten Schritt weiter.
Erweiterung des Benutzermodells
Für den nächsten Schritt müssen Sie eine kleine Änderung am Benutzermodell vornehmen und Informationen über den Code hinzufügen, der bestätigt werden muss.
Im Allgemeinen enthält das Modell User zunächst Felder, die für diese Aufgabe verwendet werden können - Confirmed, Confirmation code, Confirmation code expires at. In diesem Beispiel gehen wir jedoch davon aus, dass diese Felder nur für die Registrierung und die erste Überprüfung des Kontos verwendet werden.
Um den Prozess zu verdeutlichen, erstellen wir ein separates Modell twofa (two-factor authentication), verknüpfen das Modell User mit diesem (1-zu-1-Beziehung, has one) und fügen ein Feld hinzu - code ( TypString ).
Vorbereitungen für den Versand von E-Mails
Um E-Mails mit Bestätigungscodes zu versenden, sollte man sich vorbereiten. Eine der am besten zugänglichen Optionen ist die Verwendung des Custom SMTP Modul, das Sie installieren und konfigurieren müssen.
Bei der Verwendung von Gmail sind die meisten Einstellungen bereits voreingestellt, und Sie müssen nur noch Ihren Benutzernamen und Ihr Passwort hinzufügen. Wenn Sie andere Mailserver verwenden, sollten Sie in deren Dokumentation nachsehen, um die erforderlichen Daten zu erhalten.
In diesem Fall müssen Sie möglicherweise die Sicherheitseinstellungen des Mailservers leicht ändern. So kann es beispielsweise sein, dass Gmail standardmäßig Verbindungen mit Anwendungen von Drittanbietern blockiert, und Sie müssen diese Einschränkung in den Einstellungen aufheben.
Übermittlung eines Verifizierungscodes
Wir haben die Anmeldung und das Kennwort überprüft und alle notwendigen Vorbereitungen getroffen, so dass Sie nun einen Brief mit einem Bestätigungscode versenden können.
Der Custom SMTP: Send Email Block verwendet eine Reihe von Adressen als Ziel. Auch wenn Sie einen Brief nur an eine einzige Adresse senden wollen, sollte diese dem Array hinzugefügt werden. Hierfür wird der Append Array Block verwendet.
Der nächste Schritt besteht darin, einen Verifizierungscode zu erzeugen. Der Random string Block ist dafür geeignet. Wir senden einen Code bestehend aus 6 Zufallszahlen und nehmen die entsprechenden Einstellungen vor. Length = 6, With 0-9 = True, alle anderen Parameter = False.
Als nächstes müssen Sie den Text des Briefes erstellen. Verwenden Sie dazu den Concat Strings Block, um dem generierten Code einen erklärenden Text hinzuzufügen (First = Verification code: ), konvertieren Sie das Ergebnis in den Datentyp Text (To Text Block), und verbinden Sie das Ergebnis mit dem body Parameter des E-Mail-Versandblocks.
Für den endgültigen Versand müssen Sie nur noch den Betreff des Briefes (subject) und den Absender (from_name) angeben.
Aber es reicht nicht aus, den Code zu versenden, er muss auch in den Daten des Nutzers gespeichert werden. Schließlich muss seine Korrektheit überprüft werden, wenn der Benutzer den Code erhält und als Bestätigung zurücksendet.
Zu diesem Zweck verwenden wir das Modell twofa, das wir vorsichtshalber bereits erstellt haben. Wenn es sich um die erste Übermittlung eines Codes handelt, müssen Sie ihn mit der Information erstellen, zu welchem Benutzer er gehört. Im Falle einer Wiederverwendung ist es notwendig, den bestehenden Eintrag mit seiner ID und dem neuen Code zu ergänzen.
Der letzte Schritt der Phase ist die Verwendung des Raise Error Block eine Nachricht über den Versand des Codes an die E-Mail zurück.
Überprüfung der Relevanz des Codes
Es lohnt sich, für zusätzliche Sicherheit zu sorgen und den Code vor einer banalen Aufzählung zu schützen. Es wäre ratsam, die Anzahl der Eingabeversuche, ihre Häufigkeit und die Lebensdauer des eingereichten Codes zu begrenzen. Wir werden nicht alle diese Beispiele analysieren; die Sicherheitsanforderungen sind für jedes Projekt individuell und können viele verschiedene Bedingungen umfassen. Wir beschränken uns auf die Überprüfung der Relevanz des Codes anhand seiner Gültigkeitsdauer.
Verwenden wir den Current date & time Block, um die aktuelle Zeit zu ermitteln. Verbinden Sie ihn mit dem Parameter B des Date & time difference Blocks. Wir verwenden das UpdatedAt Feld des Modells twofa als den Parameter A.
Als Ergebnis erhalten wir Time span - die Differenz zwischen zwei Zeitpunkten. Es bleibt nur noch zu prüfen, ob diese Differenz einen bestimmten ausgewählten Wert überschreitet. In unserem Beispiel sind dies 5 Minuten, die wir als statischen Wert B des Greater Blocks festlegen.
Der If-Else Block verwendet das Vergleichsergebnis, um den Prozess weiter zu steuern. Wenn True (die Differenz übersteigt 5 Minuten), kehrt der Prozess zum Schritt des Versendens des Briefes zurück; der Benutzer erhält einen aktualisierten Code. Im Fall von False (der Code ist frisch und aktuell), kann mit der Überprüfung dieses Codes fortgefahren werden.
Überprüfung des Codes
Die letzte Stufe der Authentifizierung ist die Überprüfung des empfangenen Codes.
Der Equal Block muss überprüfen, ob der vom Benutzer eingegebene Code mit dem Code übereinstimmt, der in dem mit dem Benutzer verbundenen Modell twofa gespeichert ist. Wenn dies nicht der Fall ist und der Code falsch angegeben wurde (If-Else -> False), müssen Sie eine Fehlermeldung anzeigen (Raise Error, Message = Code is wrong). Wenn der Vergleich die Übereinstimmung bestätigt, können Sie mit der letzten Authentifizierungsstufe fortfahren.
Hierfür verwenden wir den Auth: Authentication Block und holen uns Informationen über den Benutzer mit seinem Autorisierungs-Token. Wir übergeben sie an den End Block als Ergebnis der erfolgreichen Authentifizierung.
Erstellen eines Endpunkts
Der Geschäftsprozess wurde erstellt, kann aber noch nicht verwendet werden. Sie müssen einen Endpunkt erstellen, der diesen Geschäftsprozess ausführt.
Eine vernünftige Lösung wäre die Verwendung des Standard-Authentifizierungsendpunkts (POST /Auth). Es reicht aus, seinen Geschäftsprozess zu ersetzen und den soeben erstellten Prozess zu installieren. Auf diese Weise wird die einfache Authentifizierung deaktiviert und stattdessen die Zwei-Faktor-Authentifizierung verwendet.
Veröffentlichung und Test
Damit ist die Erstellung der Zwei-Faktor-Authentifizierung abgeschlossen. Sie können das Ergebnis veröffentlichen und es in der Praxis testen. Dazu verwenden Sie am besten Swagger, auf das Sie durch Klicken auf den Namen des Bereitstellungsplans im Abschnitt Project API der Schaltfläche Preview zugreifen können.
Es bleibt nur noch, den gewünschten Endpunkt in der Liste zu finden, Benutzerdaten einzugeben und die Ausführung mit der Schaltfläche Execute zu starten. Wenn beim Testen Fehler gefunden werden, kehren Sie zum Geschäftsprozess zurück und nehmen Sie die notwendigen Änderungen vor.