2016-12-08 4 views
5

私のアプリでは、ユーザーは電子メール/パスワードを使ってバックエンドに認証/ログインできます。今私もタッチIDを実装することを考えています。Swift ios touch idログインフロー

しかし、私はタッチIDを使用してログインフローについて混乱しています。コードを使用して

怒鳴る私は簡単なユーザー認証を行うことができます。

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

をしかし、私はそれがあるユーザーを知りません。

ユーザーがアカウントを作成したときに、デバイスID(存在する場合)をDBに保存する必要があります。ユーザーがタッチIDを使用すると、デバイスIDを確認できます。

答えて

-2

touch-idからユーザーの詳細を取得することはできませんが、KeyChainTouchIDを使用すると、メールとパスワードの値を保存して保護することができます。 デバイスIDなしでこれを行うことができます。 iOSの9から、キーチェーンのデータはより安全であり、現在のユーザーkSecAccessControlTouchIDCurrentSetして詳細を保存する(タッチで認証された。)

ときに最初のユーザーログインあなたがキーチェーンにhere

ストアユーザIDから、それについての詳細を読むことができますキーチェーン内にあります。

キーチェーンにデータを格納するためのコード:

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

} 

ユーザのログインは、タッチで認証するオプションを提供し、次の時間。タッチの検証後、必要に応じてキーチェーンから保存されたユーザーIDの値を取得し、サーバーで認証します。

キーチェーンからデータを取得するためのコード:

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

}