Automatisch generierte Passwörter in iOS 12

Wenn Ihre Anwendung über eine Registrierungsfunktion verfügt, die die Möglichkeit oder Notwendigkeit umfasst, einen neuen Benutzernamen und ein neues Kennwort einzugeben, sind Sie höchstwahrscheinlich an der Innovation in iOS 12 interessiert, die ich skizzieren möchte. Dies ist ein Dienst, der neue Kennwörter für den Benutzer erfindet, diese automatisch in den erforderlichen Feldern ersetzt und sicher im Schlüsselbund speichert .

Automatisch von den Systemkennwörtern generierte Kennwörter sind am widerstandsfähigsten gegen Auswahl (zufällig generierte Zeichenfolgen - angepasst an benutzerdefinierte Einschränkungen, aber dazu später mehr), entlasten Anwendungsbenutzer von der Notwendigkeit, eine eigene Folge zu erstellen, und sind flexibel auf die Anforderungen einer bestimmten Anwendung konfiguriert. Die Unterstützung für neue Funktionen ist jedoch recht einfach, jedoch nicht ohne Funktionen. Aber das Wichtigste zuerst.

Rechte und Pflichten


Zunächst muss die Anwendung den Wunsch erklären, diese Funktionalität zu nutzen. In der Liste der Funktionen des entsprechenden Ziels müssen Sie zunächst eine Domäne in der Liste der zugeordneten Domänen haben . Seltsamerweise muss die Anwendung über eine „zugeordnete Domäne“ verfügen, um die generierten Kennwörter verwenden und im „Schlüsselbund“ des Benutzers speichern zu können (diese beiden Funktionen sind miteinander verbunden, und die Generierung kann nicht getrennt vom Speicher verwendet werden).

Wenn die Anwendung bereits die Verwendung freigegebener Konten für Ihre Site unterstützt (die sogenannten "freigegebenen Anmeldeinformationen") , liegt dieser Schritt bereits zurück. Möglicherweise liegt es auch bereits dahinter, und wenn die Anwendung Universal Links oder einen anderen Mechanismus zur Verarbeitung externer „URLs“ unterstützt .

Nach dem Hinzufügen dieser Kompatibilität hat die Anwendung jedenfalls eine neue Berechtigung .

Zusätzlich zu dieser allgemeineren Kompatibilität sollte die Anwendung auch über "Capatibility" (AutoFill Credential Provider) verfügen. Auf diese Weise kann die Anwendung mit Erlaubnis des Benutzers die vom System angebotenen Anmeldungen und Kennwörter verwenden. Durch Hinzufügen dieser Kompatibilität wird die Berechtigung zum Anbieter von AutoFill-Anmeldeinformationen angezeigt .
Das Hinzufügen dieser und anderer Funktionen steht übrigens nur Mitgliedern des Apple Developer Program zur Verfügung .
Das von der Anwendung verwendete Bereitstellungsprofil muss außerdem die folgenden zwei Funktionen enthalten.

Verwendete Abhängigkeiten


Das Hinzufügen einer geeigneten Kompatibilität führt dazu, dass das AuthenticationServices- Framework in der Liste der verknüpften Frameworks und Bibliotheken des entsprechenden Ziels angezeigt wird. Dieser Punkt weist einige erwähnenswerte Merkmale auf.

Erstens funktioniert das automatische Hinzufügen eines verwandten Frameworks möglicherweise nicht beim ersten Mal: ​​Wenn ich die Anwendung auf einem realen Gerät von meiner Kopie von "Xcode" Version 10.1 aus starte, "stürzte" die Anwendung sofort ab, da "AuthenticationServices" fehlen. Das Problem wurde behoben, indem das Framework manuell entfernt und wieder zur Liste der zugehörigen Komponenten hinzugefügt wurde.

Zweitens wird das automatische Hinzufügen eines Frameworks als "Erforderlich" markiert. Wenn Ihre Anwendung die Möglichkeit impliziert, unter den iOS-Versionen unter 12 zu arbeiten, führt dies auch dazu, dass sie in der Startphase unter Betriebssystemen niedrigerer Versionen abstürzt. "AuthenticationServices" sind nur für Systeme der Version 12 verfügbar. Dieses Problem wird gelöst, indem das Framework als "Optional" markiert wird.

Textfeldunterstützung


Zur Unterstützung der Funktionalität mit Textfeldern wird die Variable textContentType Protokolls UITextInputTraits . Die UITextField Klasse, die höchstwahrscheinlich zur Eingabe des Logins und des Kennworts in der Anwendung verwendet wird, implementiert bereits die Anforderungen des von uns benötigten Protokolls.

textContentType ist ein Feld vom Typ UITextContentType das nur eine Reihe von Konstanten enthält. Was wir im Moment newPassword , ist newPassword , das zur Eingabe eines neuen Passworts verwendet wird, das gerade erfunden wird (nicht zu verwechseln mit dem password das zur Eingabe eines vorhandenen Passworts verwendet wird).

 let passwordTextField = UITextField() if #available(iOS 12, *) { passwordTextField.textContentType = .newPassword } 

Das Festlegen des Werts von textContentType in eine "API" textContentType , da diese Konstante wie die allgemeine Funktionalität nur ab "iOS 12" verfügbar ist.

Zusätzlich zum Inhaltstyp muss das Textfeld eine sichere Dateneingabe bieten:

 passwordTextField.isSecureTextEntry = true 

Obwohl die Anwendung möglicherweise die in unserer Zeit beliebte Funktion zum Anzeigen und Ausblenden des eingegebenen Passworts bietet, wird das generierte Passwort nur angeboten, wenn das Flag zu diesem Zeitpunkt true ist.

Ein interessanter Punkt hängt mit dem Inhaltstyp des Textfelds zusammen: Wenn auf dem Bildschirm kein anderes Feld mit dem username des Inhaltstyps vorhanden ist, wird das automatisch generierte Kennwort nicht angeboten. Dies liegt daran, dass die Funktionalität nicht nur auf dem angegebenen Typ des Textfeldinhalts basiert, sondern auch auf einer heuristischen Analyse des Bildschirminhalts .

Es scheint, dass die Kennwortgenerierung die Logik von Bildschirmen „bricht“, für deren Überprüfung ein neues Kennwort zweimal eingegeben werden muss. Zumindest habe ich noch keinen Weg gefunden, diese beiden Funktionen zusammen zu nutzen. Und anscheinend bin ich nicht der einzige .

Es ist erwähnenswert, dass, wenn das Login semantisch eine E-Mail-Adresse ist (und ich daher wirklich den geeigneten Tastaturtyp haben möchte), die Tastaturtypen und der Inhalt kombiniert werden können:

 let userNameTextField = UITextField() userNameTextField.keyboardType = .emailAddress userNameTextField.textContentType = .username 

Passwortanforderungen


Oft müssen Benutzerkennwörter bestimmten Regeln folgen (eine bestimmte Länge haben, bestimmte Zeichen enthalten usw.). Diese Regeln können angegeben werden, damit das System sie beim Generieren von Kennwörtern berücksichtigt. Dies erfolgt über die Eigenschaft passwordRules des UITextInputTraits Protokolls. Zum Beispiel:

 if #available(iOS 12, *) { passwordTextField.passwordRules = UITextInputPasswordRules(descriptor: "required: upper; required: lower; required: digit; minlength: 8;") } 

Die Eigenschaft ist auch nur ab "iOS 12" verfügbar.

Der Typ der Eigenschaft ist UITextInputPasswordRules . Initialisierung - unter Verwendung einer Deskriptorzeichenfolge. Das Handle hat eine einfache Syntax und besteht aus einfachen Kennwortanforderungen, die mit einem Semikolon aufgelistet sind. Jede Anforderung ist ein Schlüssel-Wert-Paar, das durch einen Doppelpunkt getrennt ist. Der Schlüssel ist der Regeltyp (z. B. "muss unbedingt enthalten sein" - required ), und der Wert ist das Element, das dieser Regel folgen muss (z. B. Ziffern - digit ).

Im obigen Beispiel bedeutet der Deskriptor:

  • required: upper - das Vorhandensein von mindestens einem Großbuchstaben ist erforderlich;
  • required: lower - Gleiches gilt für mindestens einen Kleinbuchstaben.
  • required: digit - Gleiches gilt für mindestens eine Kleinbuchstabe.
  • minlength: 8 - Die Mindestlänge beträgt acht Zeichen.

Eine detaillierte Auflistung möglicher Schlüssel und Werte finden Sie in einem guten Artikel, der auf der NSHipster-Website veröffentlicht wurde .

Und Apple bietet einen recht praktischen Assistenten zum Zusammenstellen von Deskriptoren , der nicht nur eine bequeme Möglichkeit zum Erstellen dieser Deskriptoren bietet, sondern auch eine Überprüfung kompilierter Deskriptoren in Form einer unbegrenzten Anzahl generierter Beispiele. Dort können Sie sehen, welche Regeln standardmäßig angewendet werden.

Validierung


Nur für den Fall, dass klargestellt werden sollte, dass der Mechanismus zur Kennworterzeugung keine Validierung der vom Benutzer eingegebenen Daten bietet - Sie müssen sich selbst darum kümmern. Was natürlich ziemlich logisch ist, weil Der Anwendungsbenutzer kann das vorgeschlagene automatisch generierte Kennwort ablehnen oder sogar die Generierung von Kennwörtern und die automatische Vervollständigung von Feldern verbieten.

Interface Builder


Was bemerkenswert und im Geiste unserer Zeit ist, können alle aufgelisteten Textfeldeinstellungen im "Interface Builder" bis zur "Passwortregel" festgelegt werden:

Bild

Funktionsprüfung


Die Funktionalität ist nicht kompliziert, weist jedoch eine Reihe von Nuancen auf: Wenn Sie sie konfigurieren, können Sie leicht etwas vergessen. In diesem Fall wird in den "Debug" -Baugruppen, wenn das entsprechende Textfeld aktiviert ist, der Grund in der Konsole angezeigt, für die die Funktionalität derzeit nicht funktioniert.

Zum Beispiel:

 [AutoFill] Cannot show Automatic Strong Passwords for app bundleID: <...> due to error: Cannot save passwords for this app. Make sure you have set up Associated Domains for your app and AutoFill Passwords is enabled in Settings 

Beachten Sie außerdem immer, dass diese Art von Funktionalität zu den Aktionen gehört, für die eine Benutzerberechtigung erforderlich ist. In diesem Fall sind zwei erforderlich:

1. iCloud-Schlüsselbund;
2. AutoFill.

Fazit


Dies scheint alles zu sein, worauf bei der Unterstützung neuer Funktionen geachtet werden sollte. Wenn jemand, der gerade daran arbeitet, auf andere interessante Funktionen gestoßen ist, werde ich dies einmal kommentieren und den Artikel gegebenenfalls ergänzen.

Die Funktion ist sehr interessant und kann bei korrekter Verwendung die Benutzererfahrung Ihrer Anwendung verbessern!

Source: https://habr.com/ru/post/de438580/


All Articles