2017-05-29 8 views
0

ユーザーがログアウトしたときに、サービスからキーチェーンの値を削除したい。しかし、私はそれを行うベストプラクティスの方法について混乱していると感じています。ユーザーのログアウト時にキーチェーンの値がクリアされる

は、ここで私は、私はあなたがあなたのデータをクリアすることができます何でもフォームキーホルダー実際

答えて

0

を削除する必要があるかどうかSHUREていないよ、明らかに私のサービス

let userAccount = "AuthenticatedUser" 
let accessGroup = "SecuritySerivice" 

let passwordKey = "KeyForPassword" 

let kSecClassValue = NSString(format: kSecClass) 
let kSecAttrAccountValue = NSString(format: kSecAttrAccount) 
let kSecValueDataValue = NSString(format: kSecValueData) 
let kSecClassGenericPasswordValue = NSString(format: kSecClassGenericPassword) 
let kSecAttrServiceValue = NSString(format: kSecAttrService) 
let kSecMatchLimitValue = NSString(format: kSecMatchLimit) 
let kSecReturnDataValue = NSString(format: kSecReturnData) 
let kSecMatchLimitOneValue = NSString(format: kSecMatchLimitOne) 

public class KeychainService: NSObject { 

    public class func savePassword(token: String) { 
     self.save(service: passwordKey, data: token) 
    } 

    public class func loadPassword() -> String? { 
     return self.load(service: passwordKey) 
    } 

    public class func removePassword() { 

    } 

    private class func save(service: String, data: String) { 
     let dataFromString: Data = data.data(using: String.Encoding(rawValue: String.Encoding.utf8.rawValue), allowLossyConversion: false)! 

     let keychainQuery: NSMutableDictionary = NSMutableDictionary(objects: [kSecClassGenericPasswordValue, service, userAccount, dataFromString], forKeys: [kSecClassValue, kSecAttrServiceValue, kSecAttrAccountValue, kSecValueDataValue]) 

     SecItemDelete(keychainQuery as CFDictionary) 

     SecItemAdd(keychainQuery as CFDictionary, nil) 
    } 

    private class func load(service: String) -> String? { 

     let keychainQuery: NSMutableDictionary = NSMutableDictionary(objects: [kSecClassGenericPasswordValue, service, userAccount, kCFBooleanTrue, kSecMatchLimitOneValue], forKeys: [kSecClassValue, kSecAttrServiceValue, kSecAttrAccountValue, kSecReturnDataValue, kSecMatchLimitValue]) 

     var dataTypeRef :AnyObject? 

     // Search for the keychain items 
     let status: OSStatus = SecItemCopyMatching(keychainQuery, &dataTypeRef) 
     var contentsOfKeychain: String? = nil 

     if status == errSecSuccess { 
      if let retrievedData = dataTypeRef as? Data { 
       contentsOfKeychain = String(data: retrievedData, encoding: String.Encoding.utf8) 
      } 
     } else { 
      print("KEY: Nothing was retrieved from the keychain. Status code \(status)") 
     } 

     return contentsOfKeychain 
    } 

    private class func remove(service: String) { 

    } 

} 

です。ライン

keychain["yourKey"] = nil 

または

do { 
try keychain.remove("yourKey") 
} catch let error { 
print("error: \(error)") 
} 

おかげ

0

あなたがKeychainItemWrapperを使用してアイテムを削除したい場合は、-resetKeychainItemを使用して下にしてみてください。これにより、SecItemDelete()が正しい値で呼び出されます。

+0

いいえ、実際はラッパーは使用していません – dand1

関連する問題