Mots de passe générés automatiquement dans iOS 12

Si votre application a une fonction d'enregistrement qui inclut la possibilité ou la nécessité de saisir un nouveau nom d'utilisateur et un nouveau mot de passe, vous serez probablement intéressé par l'innovation dans iOS 12 , que j'aimerais souligner. Il s'agit d'un service qui invente de nouveaux mots de passe pour l'utilisateur, les substitue automatiquement dans les champs nécessaires et les stocke en toute sécurité dans le trousseau .

Les mots de passe système générés automatiquement sont les plus résistants à la sélection (étant des séquences de caractères générées aléatoirement - ajustées pour les restrictions personnalisées, mais plus à ce sujet plus tard), soulagent les utilisateurs de l'application de la nécessité de créer une séquence qui leur est propre et sont configurées de manière flexible pour les besoins d'une application particulière. La prise en charge de nouvelles fonctionnalités est assez facile à fournir, cependant, non sans fonctionnalités. Mais tout d'abord.

Droits et obligations


Tout d'abord, l'application doit déclarer sa volonté d'utiliser cette fonctionnalité. Dans la liste des capacités de la cible correspondante , vous devez d'abord avoir un domaine dans la liste des domaines associés . Curieusement, l'application doit avoir un «domaine associé» afin de pouvoir utiliser les mots de passe générés et les stocker dans le «trousseau» de l'utilisateur (ces deux fonctions sont interconnectées et la génération ne peut pas être utilisée séparément du stockage).

Si l'application prend déjà en charge l' utilisation de comptes partagés avec votre site (les «informations d'identification partagées») , cette étape est déjà en retard. Il peut également être déjà en retard et si l'application prend en charge les liens universels ou un autre mécanisme de traitement des «URL» externes.

Quoi qu'il en soit, après avoir ajouté cette compatibilité, l'application aura un nouveau «droit» .

En plus de cette compatibilité plus générale, l'application devrait également avoir la «capacité» «fournisseur d'informations d'identification de remplissage automatique» - cela permet à l'application, si l'autorisation de l'utilisateur est autorisée, d'utiliser les identifiants et les mots de passe proposés par le système. L'ajout de cette compatibilité entraînera l'apparition de l'autorisation Autofill Credential Provider Entitlement .
Soit dit en passant, l'ajout de cette fonctionnalité et d'autres fonctionnalités n'est disponible que pour les membres du programme pour développeurs Apple .
Le profil d'approvisionnement utilisé par l'application doit également inclure les deux fonctionnalités suivantes.

Dépendances utilisées


L'ajout de la compatibilité appropriée entraînera l'apparition du cadre AuthenticationServices dans la liste Frameworks et bibliothèques liés de la cible correspondante. Ce point a quelques caractéristiques qui méritent d'être mentionnées.

Premièrement, l'ajout automatique d'un framework associé peut ne pas «fonctionner» la première fois: lorsque je lance l'application sur un appareil réel à partir de ma copie de «Xcode» version 10.1, l'application a immédiatement «planté» en raison du manque de «AuthenticationServices». La suppression manuelle du cadre et son ajout à la liste des composants associés ont résolu le problème.

Deuxièmement, l'ajout automatique d'un framework le marque comme «Obligatoire». Si votre application implique la possibilité de travailler "sous" les versions "iOS" inférieures à 12, cela entraînera également son plantage lors de la phase de démarrage "sous" les systèmes d'exploitation des versions inférieures. "AuthenticationServices" n'est disponible que pour les systèmes de la version 12. Ce problème est résolu en marquant le cadre comme «facultatif» .

Prise en charge de la zone de texte


Pour prendre en charge la fonctionnalité avec des champs de texte, la variable textContentType protocole textContentType est UITextInputTraits . La classe UITextField , qui est très probablement utilisée pour entrer le login et le mot de passe dans l'application, implémente déjà les exigences du protocole dont nous avons besoin.

textContentType est un champ de type UITextContentType contenant uniquement un ensemble de constantes. Ce dont nous avons besoin pour le moment, c'est newPassword , utilisé pour entrer un nouveau mot de passe en cours d'invention (à ne pas confondre avec le seul password utilisé pour entrer un mot de passe existant).

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

La définition de la valeur de textContentType encapsulée dans une vérification d'accessibilité «API» , car, comme la fonctionnalité générale, cette constante n'est disponible qu'à partir de «iOS 12».

En plus du type de contenu, le champ de texte doit fournir une entrée de données sécurisée:

 passwordTextField.isSecureTextEntry = true 

Bien que l'application puisse fournir la fonctionnalité d'afficher et de masquer le mot de passe entré qui est populaire à notre époque, le mot de passe généré ne sera proposé que si le drapeau est true à ce moment.

Un point intéressant est lié au type de contenu du champ de texte: si aucun autre champ n'est présent à l'écran, avec le username type de contenu, le mot de passe généré automatiquement ne sera pas proposé. Cela est dû au fait que la fonctionnalité est basée non seulement sur le type spécifié de contenu de champ de texte, mais sur une analyse heuristique du contenu de l'écran .

Il semble que la génération de mot de passe «casse» la logique des écrans qui nécessitent un nouveau mot de passe pour être vérifié deux fois. Au moins, je n'ai pas encore trouvé de moyen d'utiliser ces deux fonctionnalités ensemble. Et il semble que je ne suis pas le seul .

Il convient de mentionner que si la connexion est sémantiquement une adresse e-mail (et, par conséquent, je veux vraiment avoir le type de clavier approprié), les types de clavier et de contenu peuvent être combinés:

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

Exigences de mot de passe


Souvent, les mots de passe des utilisateurs doivent suivre certaines règles (avoir une certaine longueur, inclure certains caractères, etc.). Ces règles peuvent être spécifiées pour que le système les prenne en compte lors de la génération des mots de passe. Cela se fait via la propriété passwordRules du protocole UITextInputTraits . Par exemple:

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

La propriété est également disponible uniquement à partir de "iOS 12".

Le type de la propriété est UITextInputPasswordRules . Initialisation - à l'aide d'une chaîne de descripteurs. Le descripteur a une syntaxe simple et se compose d'exigences de mot de passe simples, répertoriées avec un point-virgule. Chaque exigence est une paire clé-valeur, séparée par deux points. La clé est le type de règle (par exemple, "nécessairement inclut" - required ), et la valeur est l'élément qui doit suivre cette règle (par exemple, chiffres - digit ).

Dans l'exemple ci-dessus, le descripteur signifie:

  • required: upper - la présence d'au moins une majuscule est requise;
  • required: lower - le même pour au moins une lettre minuscule;
  • required: digit - le même pour au moins un chiffre en minuscule;
  • minlength: 8 - la longueur minimale est de huit caractères.

Une liste détaillée des clés et valeurs possibles peut être trouvée dans un bon article publié sur le site Web de NSHipster .

Et Apple propose un assistant de compilation de descripteurs plutôt pratique, qui fournit non seulement un moyen pratique de les construire, mais également une vérification des descripteurs compilés sous la forme d'un nombre illimité d'exemples générés. Vous pouvez y voir quelles règles sont appliquées par défaut.

Validation


Au cas où, il convient de préciser que le mécanisme de génération de mot de passe ne permet pas de valider les données saisies par l'utilisateur - vous devez vous en occuper vous-même. Ce qui, bien sûr, est assez logique, car l'utilisateur de l'application peut refuser le mot de passe généré automatiquement proposé ou même interdire la génération de mots de passe et l'auto-complétion des champs.

Constructeur d'interface


Ce qui est remarquable et dans l'esprit de notre temps, tous les paramètres de champ de texte répertoriés peuvent être définis dans le "Interface Builder" , jusqu'à la "règle de mot de passe":

image

Vérification de fonctionnalité


La fonctionnalité n'est pas compliquée, mais elle a un certain nombre de nuances: lorsque vous la configurez, vous pouvez facilement oublier quelque chose. Dans ce cas, dans les assemblys "debug", lorsque le champ de texte correspondant est activé, la raison sera affichée dans la console pour laquelle la fonctionnalité ne fonctionne pas actuellement.

Par exemple:

 [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 

En outre, vous devez toujours garder à l'esprit que ce type de fonctionnalité fait partie des actions pour lesquelles l'autorisation de l'utilisateur est requise. Dans ce cas, deux sont requis:

1. Porte-clés iCloud;
2. Remplissage automatique.

Conclusion


Cela semble être tout ce à quoi il faut faire attention tout en fournissant un support pour les nouvelles fonctionnalités. Si quelqu'un en train de travailler sur cela a rencontré d'autres fonctionnalités intéressantes, je commenterai une fois et, si nécessaire, assurez-vous de compléter l'article.

La fonctionnalité est assez intéressante et, si elle est utilisée correctement, est tout à fait capable d'améliorer l' expérience utilisateur de votre application!

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


All Articles