280 votes

iOS : comment stocker le nom d'utilisateur/mot de passe dans une application ?

J'ai un écran de connexion dans mon application iOS. Le nom d'utilisateur et le mot de passe seront sauvegardés dans le fichier NSUserDefaults et être chargé à nouveau dans l'écran de connexion lorsque vous entrez à nouveau dans l'application (bien sûr, NSUserDefaults sont permanents).

Maintenant, l'utilisateur a la possibilité de désactiver la fonction de sauvegarde du nom d'utilisateur/mot de passe.

Ainsi, le NSUserDefaults sera alors effacée.

Mais dans mon application, j'ai besoin de ce nom d'utilisateur/mot de passe pour les requêtes de base de données pour l'utilisateur. Donc : Où stocker les données sauf NSUserDefaults ? (Cet endroit peut/doit être supprimé lorsque l'utilisateur quitte l'application ou se déconnecte).

0 votes

L'utilisateur ne peut l'effacer qu'en réinitialisant l'appareil ou en supprimant l'application. Est-ce que quelque chose m'échappe ?

3 votes

Et d'ailleurs, si les données doivent être supprimées lorsque l'utilisateur quitte l'application, pourquoi ne pas simplement les conserver en RAM ?

10 votes

Vous devriez sérieusement envisager d'utiliser Keychain pour stocker les noms d'utilisateur et les mots de passe au lieu de NSUserDefaults.

426voto

Filip Radelic Points 18860

Vous devriez toujours utiliser le trousseau pour stocker les noms d'utilisateur et les mots de passe, et comme il est stocké de manière sécurisée et uniquement accessible à votre application, il n'est pas nécessaire de le supprimer lorsque l'application quitte (si tel était votre souci).

Apple fournit exemple de code qui stocke, lit et supprime les éléments du trousseau. Voici comment utiliser la classe wrapper keychain de cet exemple, qui simplifie grandement l'utilisation de Keychain.

Inclure Security.framework (dans Xcode 3 clic droit sur le dossier frameworks et ajouter un framework existant. Dans Xcode 4, sélectionnez votre projet, puis sélectionnez la cible, allez dans l'onglet Build Phases et cliquez sur + sous Link Binary With Files) et KeychainItemWrapper .h & .m dans votre projet, #importer le fichier .h partout où vous avez besoin d'utiliser keychain et ensuite créer une instance de cette classe :

KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"YourAppLogin" accessGroup:nil];

( VotreAppLogin peut être tout ce que vous avez choisi pour appeler votre élément de trousseau et vous pouvez avoir plusieurs éléments si nécessaire)

Ensuite, vous pouvez définir le nom d'utilisateur et le mot de passe en utilisant :

[keychainItem setObject:@"password you are saving" forKey:kSecValueData];
[keychainItem setObject:@"username you are saving" forKey:kSecAttrAccount];

Obtenez-les en utilisant :

NSString *password = [keychainItem objectForKey:kSecValueData];
NSString *username = [keychainItem objectForKey:kSecAttrAccount];

Ou les supprimer en utilisant :

[keychainItem resetKeychainItem];

0 votes

J'ai vu ce code avant, mais il est très difficile pour moi de le lire et de le comprendre, car je suis nouveau dans le développement iOS. La sauvegarde des données dans NSUserDefaults était très simple (3-4 lignes de code). Pouvez-vous m'aider un peu plus, avec quelques lignes de code pour sauvegarder le nom d'utilisateur et le mot de passe facilement !

5 votes

J'ai mis à jour ma réponse avec le code et la description. Ce n'est pas aussi difficile que vous le pensiez.

45 votes

ATTANTION ! S'il vous plaît ajouter à votre réponse, que seulement "copier KeychainItemWrapper" n'est pas suffisant ! J'ai eu le problème, que je ne peux pas le construire après ! Vous devez ajouter le security.framework à votre projet pour que le KeychainItemWrapper fonctionne ! (Comment faire : Sélectionner le projet -> Sélectionner la cible -> Sélectionner l'onglet "Build Phases" -> Sélectionner "Link Binary With Libaries" -> "+" -> ajouter Security.Framework)

97voto

Manuel Pintaldi Points 660

Si vous avez besoin d'une version ARC du wrapper, voici le lien https://gist.github.com/1170641 Merci à

0 votes

Merci, j'ai obtenu KeychainItemWrapper .h & .m à partir de cette URL.

48voto

sust86 Points 807

Une solution très simple via Porte-clés .

Il s'agit d'une simple enveloppe pour le trousseau de clés du système. Il suffit d'ajouter le SSKeychain.h , SSKeychain.m , SSKeychainQuery.h et SSKeychainQuery.m à votre projet et ajoutez le Security.framework à votre cible.

Pour enregistrer un mot de passe :

[SSKeychain setPassword:@"AnyPassword" forService:@"AnyService" account:@"AnyUser"]

Pour récupérer un mot de passe :

NSString *password = [SSKeychain passwordForService:@"AnyService" account:@"AnyUser"];

setPassword est la valeur que vous voulez sauvegarder et forService est la variable sous laquelle vous voulez qu'il soit enregistré et le compte est pour quel utilisateur/objet le mot de passe et toute autre information est pour.

0 votes

Savez-vous comment utiliser sskeychain pour synchroniser les applications avec le même nom d'utilisateur et le même mot de passe ?

4 votes

Comment stocker un nom d'utilisateur en plus d'un mot de passe ? Comment supprimer un compte entier du trousseau de clés SSKeychain ? Les deux ne sont pas mentionnés dans la documentation

2 votes

Pour obtenir le nom d'utilisateur, faites NSString *username = [[SSKeychain accountsForService:@"AnyService"][0] valueForKey:@"acct"] . Cela devrait fonctionner correctement si vous n'utilisez qu'un seul compte. Comme toujours, assurez-vous de vérifier la longueur du tableau avant d'essayer d'accéder à l'index 0.

27voto

Phil Points 1427

Vous pouvez simplement utiliser NSURLCredential il sera enregistrer le nom d'utilisateur et le mot de passe dans le trousseau de clés en deux lignes de code seulement .

Voir mon rapport détaillé réponse .

11voto

Robby891 Points 51

Si vous rencontrez un problème pour récupérer le mot de passe à l'aide de l'enveloppe du trousseau, utilisez ce code :

NSData *pass =[keychain objectForKey:(__bridge id)(kSecValueData)];
NSString *passworddecoded = [[NSString alloc] initWithData:pass
                                           encoding:NSUTF8StringEncoding];

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X