Nutzerauthentifizierung

11.11.2019 Jonas L. Technik

Das Problem der Nutzerauthentifizierung kann komplex sein (E-Mail-Adressen-Verifizierung, Passwort-Vergessen-Funktion, …). Daher wird das oft ausgelagert: Entweder an Dienstleister für dieses Problem (wie Auth0) oder es wird gleich die Anmeldung mittels Facebook/ Google-Konto verwendet. Dabei gibt es eine vergleichsweise einfache Lösung.

Bei fast jeder Registrierung muss man eine E-Mail-Adresse angeben. Das ist schon ein eindeutiger Identifikator. Warum dann noch ein Benutzername? Also reicht eine E-Mail-Adresse und ein Passwort.

Aber auch das Passwort kann man wegoptimieren. Wenn es richtig umgesetzt wird bekommt man eine Registrierungsbestätigungsmail und man muss dort auf einen Link klicken, bevor das Konto aktiviert wird. Anstelle eines Bestätigungslinks kann man aber auch einen Anmeldelink versenden. Dann spart man sich das Passwort und alle Prozesse, die mit dem Passwort zu tun haben.

Aber Links in E-Mails sind nicht schön und es kann vorkommen, dass man sich nicht mit dem Gerät anmelden möchte, auf dem man die E-Mails empfängt. Dann kann man stattdessen einen Code senden. Das kann irgendetwas kryptisches sein, aber man kann auch zufällig gewählte Wörter hintereinanderhängen.

Genau auf diese Art verwende ich es produktiv in einer meiner Anwendungen.

Problem 1: Senden der E-Mails

Wie man (grundsätzlich) eine E-Mail sendet muss ich nicht erklären. Nicht jeder E-Mail-Anbieter erlaubt das automatisierte Senden von E-Mails.

Es gibt zwar Dienste wie Mailgun für das Senden von E-Mails, aber wenn man die verwendet reduziert man den Datenschutz und die Dezentralisierung.

Folglich sollte man selbst einen E-Mail-Server einrichten. Das ist an sich unproblematisch. Allerdings kann man Probleme bei der Zustellung von Nachrichten bekommen. Meine Erfahrungen bei der Zustellung:

  • Microsoft mag mich nicht/ redet nicht mit meinen Mailserver - es gibt zwar ein Formular für eine Freischaltung bei Microsoft, aber nach kurzer Zeit wurde ich wieder gesperrt
  • bei T-Online musste ich mich freischalten lassen, weil aus dem IP-Adressbereich viel Müll kam; Ich konnte dort problemlos einen Menschen erreichen und nach wenigen Stunden wurden Nachrichten zugestellt
  • bei anderen Providern gab es keine Probleme (zumindest keine Bounce-Benachrichtigungen)

Man sollte (insbesondere wegen Microsoft) eine Empfänger-Domain-Blacklist führen. Einerseits kann man sich dadurch das Senden von E-Mail, die sowieso nicht ankommen sparen. (Dadurch gibt es auch weniger Bounce-Benachrichtigungen.) Andererseits kann man Nutzer dann bei der Eingabe einer entsprechenden E-Mail-Adresse darauf hinweisen, dass dieser E-Mail-Anbieter nicht unterstützt wird.

Problem 2: Limitierungen

(Es geht um das Verhindern von Brute Force.)

Ich habe von Anfang an ein Rate-Limiting für das Senden der E-Mails eingesetzt. Dabei habe ich mehrere Limits für unterschiedliche Zeitspannen gesetzt. Folgendes wurde limitiert:

  • Senden von E-Mails insgesamt
  • Senden von E-Mails je Empfänger

Ich habe kein Limit je IP-Adresse verwendet. Das vor dem Hintergrund, dass man sehr schnell eine neue IP-Adresse bekommt, wenn man nur will, und auch, weil z.T. viele Menschen sich eine IP-Adresse teilen.

Außerdem sollte man je gesendeten Code nur wenige Versuche erlauben, bevor der Nutzer gezwungen wird, sich einen neuen Code senden zu lassen.

Problem 3: Code-Verifizierung

String-Vergleiche sind schon erfunden. Also denkt man, dass es hier keine Probleme gibt. Aber das ist nicht so. Man sollte mindestens Leerzeichen am Anfang und am Ende entfernen (oder man entfernt gleich alle Leerzeichen vor dem Vergleichen). Auch das Ignorieren von Groß- und Kleinschreibung kann helfen (insbesondere wenn Nutzer Wörter abtippen).

Problem 4: UI-Aspekte

Wenn es eine native App ist sollte man sicherstellen, dass nach einem erneuten Aufrufen der App vom Homescreen immer noch die Codeeingabemaske angezeigt wird.

Es ist zwar eine Minderheit, aber einige Nutzer öffnen Apps immer über den Homescreen und nicht über die Liste der aktiven Apps. Wenn dann die E-Mails mit dem selben Gerät empfangen werden gibt es sonst Probleme.

Problem 5: Input-Validation

Die klassische Art zur Angabe einer E-Mail-Adresse ist user@provider.tld. Aber es gibt auch noch andere Schreibweisen. Wenn man hinten ein Leerzeichen anhängt, geht es immer noch (obwohl es bei einen reinen String-Vergleich anders wäre). Wenn man die E-Mail-Adresse in <> gibt es den selben Effekt. Man sollte also sicherstellen, dass die E-Mail-Adresse in der Art eingegeben wurde, in der man sie erwartet.

Kombinationsmöglichkeiten

Das kann man mit Single Sign On-Diensten kombinieren (sofern man diesen Diensten vertraut), indem man dann direkt die beim Dienst gespeicherte E-Mail-Adresse nutzt ohne Bestätigungs-E-Mail.

Beispielsweise kann man Google bei der Anmeldung mit einer GMail-Adresse vertrauen. Aber die Anmeldung mittels E-Mail-Adresse ist auch ohne die Kombination mit solchen Diensten sehr gut benutzbar.