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;
         }