2016-12-08 33 views
5

W mojej aplikacji użytkownik może uwierzytelnić/zalogować się do mojego backend za pomocą e-mail/hasło. Teraz zastanawiam się również nad implementacją identyfikatora Touch ID.Swift ios touch id przepływu logowania

Ale jestem zdezorientowany, jeśli chodzi o przepływ logowania za pomocą identyfikatora dotyku.

Używając kodu myszki następnie można łatwo uwierzytelnić użytkownika:

func authenticateUser() { 
    let context = LAContext() 
    var error: NSError? 

    if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) { 
     let reason = "Identify yourself!" 

     context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: reason) { 
      [unowned self] success, authenticationError in 

      DispatchQueue.main.async { 
       if success { 
        self.runSecretCode() 
       } else { 
        let ac = UIAlertController(title: "Authentication failed", message: "Sorry!", preferredStyle: .alert) 
        ac.addAction(UIAlertAction(title: "OK", style: .default)) 
        self.present(ac, animated: true) 
       } 
      } 
     } 
    } else { 
     let ac = UIAlertController(title: "Touch ID not available", message: "Your device is not configured for Touch ID.", preferredStyle: .alert) 
     ac.addAction(UIAlertAction(title: "OK", style: .default)) 
     present(ac, animated: true) 
    } 
} 

ale nie wiem, który użytkownik jest.

Tak więc, kiedy użytkownik tworzy konto, czy powinienem przechowywać w moim DB coś w rodzaju identyfikatora urządzenia (jeśli istnieje), to kiedy użytkownicy używają identyfikatora dotykowego, mogę sprawdzić, jaki jest identyfikator urządzenia, a następnie zalogować użytkownika?

Odpowiedz

-2

To prawda, że ​​nie można uzyskać szczegółów użytkownika za pomocą identyfikatora dotyku. Można jednak użyć KeyChainTouchID do przechowywania i ochrony wartości e-mail i hasła. Możesz to zrobić bez identyfikatora urządzenia. z iOS 9, dane Breloki są bardziej bezpieczne i przechowuje szczegół z obecnych użytkowników kSecAccessControlTouchIDCurrentSet (przysięgłe z Touch.)

można przeczytać więcej na ten temat z here

przechowywać identyfikator użytkownika do keychain przy logowaniu użytkownika do pierwszego w pęku kluczy.

kod do przechowywania danych w pęku kluczy:

-(void)saveToKeyChain:(NSString*)userid{ 
    CFErrorRef error = NULL; 

    SecAccessControlRef scaObject = SecAccessControlCreateWithFlags(kCFAllocatorDefault,kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly, kSecAccessControlTouchIDCurrentSet,   &error); 

    NSDictionary *attributes = @{ 
           (__bridge id)kSecClass:(__bridge id)kSecClassGenericPassword, 
           (__bridge id)kSecAttrService :@"ToucIdloginExample", 
            (__bridge id)kSecValueData :[userid dataUsingEncoding:NSUTF8StringEncoding], 
            (__bridge id)kSecUseNoAuthenticationUI :@YES, 

            (__bridge id)kSecAttrAccessControl : (__bridge_transfer id)scaObject 
           }; 

    OSStatus initialWriteStatus = SecItemAdd((__bridge CFDictionaryRef)attributes, nil); 

} 

następnym razem gdy login użytkownika, zapewniają możliwość uwierzytelniania Touch. Po sprawdzeniu poprawności dotyku uzyskaj wartość przechowywanego identyfikatora użytkownika z pęku kluczy i uwierzytelnij się na serwerze, jeśli jest to wymagane.

kod do pobierania danych z pęku kluczy:

- (void) {retriveKeyChainData

NSDictionary *querryAttributes = @{ 
          (__bridge id)kSecClass:(__bridge id)kSecClassGenericPassword, 
          (__bridge id)kSecAttrService :@"ToucIdloginExample", 
          (__bridge id)kSecReturnData : @YES, 

          (__bridge id)kSecUseOperationPrompt : @"Authenticate" 
          }.mutableCopy; 

CFTypeRef dataTypeRef = NULL; 
OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)querryAttributes, &dataTypeRef); 


if(status == errSecSuccess) 
{ 
    NSData *data = (__bridge NSData*)(dataTypeRef); 
} 

}