Débutant Intermédiaire

Touch ID, la sécurité par Apple

apple_touch_id-logo

Touch ID a été introduit avec l’iPhone 5s, permettant une authentification rapide via un lecteur biométrique. Cependant, celui n’a été ouvert aux développeurs qu’avec iOS8 et c’est avec Swift que nous allons apprendre à nous en servir.

Un des grands avantages du Touch ID est sa gestion des données, car votre empreinte est stockée sous une représentation mathématique indéchiffrable. De plus, on ne peut accéder directement à celle-ci, mais seulement demander au framework de lancer l’interface d’authentification, en lui fournissant une raison (Lancement de l’application…).

Si vous ne connaissez pas encore Swift, je vous engage à le découvrir via l’article d’Houssem Ben Slama, ou plus récemment, celui de Pascal Batty.

Authentification via Touch ID

Le lecteur biométrique n’étant disponible que sur iPhone à partir du 5s, et iPad à partir du Mini 3 et du Air 2, notre premier test va donc être de vérifier si le device est compatible : 

touchIDContext.canEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics,
                                 error:&touchIDError)

Ici, on découvre la variable touchIDContext. Celle-ci représente votre contexte d’authentification, obtenu via la fonction LAContext() du framework LocalAuthentification. S’il n’y a pas de lecteur biométrique, on renvoie l’utilisateur sur l’authentification via code.

TouchId2

L’étape suivante consiste à demander au framework d’afficher le lecteur en lui fournissant une raison (reasonString) :

touchIDContext.evaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics,
                              localizedReason: reasonString, reply: {
            (success: Bool, error: NSError?) -> Void in
                if success {
                    // Authentification réussi
                    self.pushToHomeView()
                else {
                    // Authentification échouée
                    self.showPasswordAlert()
                }
})

C’est dans le bloc « reply » que l’on va gérer la réponse du framework. Ici, la méthode self.pushToHomeView() charge la première page de votre application et self.showPasswordAlert() va rediriger l’utilisateur vers votre authentification personnalisée.

Authentification personnalisée

Par défaut, le framework propose un bouton pour permettre une authentification personnalisée à la place de Touch ID. Cependant, si cela ne vous intéresse pas, vous pouvez le préciser au framework en supprimant simplement le nom du button :

touchIDContext.localizedFallbackTitle = ""

Une manière simple d’implémenter sa propre authentification est d’utiliser une pop-up. Avec iOS8, nous découvrons AlertController, le remplaçant du contrôle AlertView

let alert = UIAlertController(title: title,
                              message: message,
                              preferredStyle: UIAlertControllerStyle.Alert)

L’avantage de AlertController est qu’il est facile d’ajouter des champs de texte dedans.

alert.addTextFieldWithConfigurationHandler { textField -> Void in
    //TextField configuration
    textField.delegate = self //Ne pas oublier d’implementer le UITextFieldDelegate
    textField.textColor = UIColor.blueColor()
}

Jusqu’ici, rien de bien compliqué.

L’interface étant terminée, nous pouvons passer aux actions qui, contrairement à l’AlertView, sont implémentées dans le contrôle et non via un délégué.

let okAction = UIAlertAction(title: "OK",
                             style: .Default,
                             handler: nil))
alert.addAction(okAction)

let loginAction = UIAlertAction(title: "Login",
                                style: .Default) { action -> Void in
    self.passwordIsValid(self.typedPass)
}
alert.addAction(loginAction)

Le premier bloc précise au contrôle de ne rien faire sur le clic du bouton « OK », alors que le deuxième lui dit d’appeler une méthode qui vérifiera la validité du texte saisi (que l’on aura récupéré depuis le délégué du champ texte).

Il ne nous reste plus qu’à afficher notre contrôle et le tour est joué.

self.presentViewController(alert, animated: true, completion: nil)

Authentification via Keychain

Il est préférable, contrairement à l’exemple précédent, de ne pas stocker les identifiants dans l’application. Pour cela, Apple propose son service sécurisé de base de données de mots de passe, nommé Keychain. Il s’agit d’une base de données sécurisée pouvant stocker toutes les informations personnelles de l’utilisateur (mot de passe, carte bancaire…) et qui peut être synchronisée sur tous les appareils qu’il aura autorisés.

En pratique, le but est d’enregistrer le mot de passe saisi par l’utilisateur dans son Keychain lors de sa première connexion, et d’interroger le Keychain pour récupérer les identifiants lors des authentifications suivantes.

Le Keychain n’est toujours accessible que par des fonctions en C, mais il existe de nombreux wrappers permettant de simplifier son interface, comme par exemple Valet. Pour plus de détails, je vous laisse la découvrir le tutoriel détaillé de Tim Mitra.

Dernier mot

Pour cet article, j’ai créé une application de gestion de mot de passe disponible sur mon Git, en me basant sur 1Password, qui a été un des premiers à le mettre en place.

Bien qu’au premier abord, Touch ID ressemble à un gadget, il impose de plus en plus son utilité et sa facilité d’utilisation dans votre quotidien. L’utilisation des applications qui l’intègrent, comme 1Password, Linxo ou Amazon, s’en voit réellement facilitée.

Nombre de vue : 106

AJOUTER UN COMMENTAIRE