2016-12-08 3 views
5

In meiner App kann sich ein Benutzer mit Hilfe von E-Mail/Passwort bei meinem Backend authentifizieren/anmelden. Jetzt denke ich auch daran, Touch ID zu implementieren.Swift ios touch id login fluss

Aber ich bin verwirrt über den Login-Flow mit einer Touch-ID.

den Code mit bellow Ich kann einfach, einen Benutzer authentifizieren:

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

Aber ich weiß nicht, welcher Benutzer es ist.

Also, wenn ein Benutzer ein Konto erstellt, sollte ich etwas wie die Geräte-ID (wenn vorhanden) in meiner Datenbank speichern, wenn die Benutzer Touch-ID verwenden, kann ich überprüfen, welche Geräte-ID es ist dann den Benutzer anmelden?

Antwort

-2

Es ist wahr, dass Sie nicht Benutzerdetails von Touch-ID erhalten können Aber Sie können KeyChainTouchID verwenden, um Ihre E-Mail und Passwort-Wert zu speichern und zu schützen. Sie können dies ohne Geräte-ID tun. von iOS 9, sind Schlüsselanhänger Daten sicherer und speichert Detail mit den aktuellen Benutzer kSecAccessControlTouchIDCurrentSet (mit Touch-authentifizierte.)

Sie weitere Informationen von here

Shop Benutzer-ID für den ersten Schlüsselbund, wenn die Benutzeranmeldung lesen im Schlüsselbund.

Code zum Speichern von Daten in Schlüsselanhängern:

-(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); 

} 

nächstes Mal, wenn die Benutzeranmeldung, Option mit Touch zu authentifizieren bieten. Nachdem Sie die Berührung bestätigt haben, holen Sie sich den Wert für die gespeicherte Benutzer-ID aus dem Schlüsselbund und authentifizieren Sie sich bei Bedarf mit dem Server.

Codedaten aus Schlüsselanhänger abzurufen:

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

}