IOS: как аутентифицировать пользователя после входа в систему (для автоматического входа в систему)?
Я хотел бы использовать функцию автоматического входа. Поэтому, когда пользователь открывает приложение, он получает делегирование на "экран входа". При успешном входе в систему он должен быть направлен на свой счет. Я называю это "экраном учетной записи". Теперь, когда пользователь перезапускает приложение, он должен сразу перейти на свою учетную запись, не видя "экрана входа".
Функция входа в систему уже отлично работает в моем проекте (имя пользователя и пароль сохраняются в UserDefault), но каждый раз, когда я закрываю приложение, мне нужно снова войти в систему. Поэтому мой вопрос: как автоматически вводить пользователя в систему? Или лучше сказал: Как проверить, сохранены ли данные (сохраненные в UserDefault) так же, как в базе данных (MYSQL)?
Ответы
Ответ 1
Чтобы ответить на вопрос: если вы хотите автоматически войти в систему с данными о брелках, используйте бесплатную фреймворк "SFHFKeychainUtils". Он сохраняет имя пользователя, пароль и servicename в цепочке ключей. если вы хотите получить его, просто сохраните имя пользователя в NSUserDefaults, и вы можете легко получить пароль.
Здесь мы идем:
SiFi HiFi Framework: https://github.com/ldandersen/scifihifi-iphone/tree/master/security
SiFi Hifi Framework (совместимость с ARC): fooobar.com/questions/344835/...
Как использовать SFHFKeychainUtils: http://gorgando.com/blog/technology/iphone_development/simple-iphone-tutorial-password-management-using-the-keychain-by-using-sfhfkeychainutils
Ответ 2
- В первый раз, когда пользователь вводит логин, вы сохраняете пользователя
учетные данные в iPhone keychain.
- Когда приложение открыто снова, вы проверяете, являются ли учетные данные пользователя
присутствует в цепочке ключей, и если да, то код должен вызывать логин
логики и сделать автоматический вход в систему и перейти на экран после входа в систему. Если нет,
то вы должны показать экран входа в систему. Вы можете сделать эту логику в приложении AppDelegates applicationDidFinishLaunching.
- Когда пользователь нажимает кнопку выхода из системы, удаляйте учетные данные пользователя из
keychain, и вернитесь к контроллеру входа.
Просто вы добавляете учетные данные для связывания ключей, когда пользователь входит в систему и только удаляет их, как только пользователь нажимает кнопку выхода. Если пользователь выходит из приложения без выхода из системы, учетные данные все равно будут в цепочке ключей, и вы сможете получить их, когда пользователь вернется в приложение.
РЕДАКТИРОВАТЬ: Я думаю, что я должен добавить еще одну вещь. Если логика входа в систему занимает много времени (например, вы входите в систему с помощью веб-запроса или чего-то еще), поместите логический код логина в свой Login ViewController, а не ApplicationDelegate и использовать любой индикатор активности во время автоматического входа в систему.
EDIT: я редактировал весь ответ, заменил NSUserDefault на Keychain. Этот поток объясняет, почему.
Ответ 3
При сохранении имени пользователя и пароля настоятельно рекомендуется сохранять в Keychain, а не NSUserDefaults. Обратитесь к этому сообщению для лучшего понимания.
Ответ 4
Я использовал комбинацию NSUserDefaults и SSKeychain. Я использовал NSUserDefaults для хранения имени пользователя над SSKeychain для хранения пароля.
Это код, который я использовал для сохранения учетных данных
NSString *user = self.username.text;
NSString *password = self.pass.text;
[SSKeychain setPassword:password forService:@"achat" account:user];
NSUserDefaults *dUser = [NSUserDefaults standardUserDefaults];
[dUser setObject:user forKey:@"user"];
[dUser synchronize];
Это код, который я использовал для получения учетных данных
NSUserDefaults *eUser = [NSUserDefaults standardUserDefaults];
NSString *savedUser = [eUser objectForKey:@"user"];
if (!savedUser) {
UIAlertView *uhoh = [[UIAlertView alloc] initWithTitle:@"Oops!" message:@"Please enter your username and password." delegate:self cancelButtonTitle:@"Okay" otherButtonTitles:nil, nil];
[uhoh show];
}
else {
NSString *savedPass = [SSKeychain passwordForService:@"achat" account:savedUser];
self.username.text = savedUser;
self.pass.text = savedPass;
}