Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /// created by amir tutunchi
- /// usage : to use this snippets of code go to project setting and in build phases in Link Binary With Libraries
- /// add LocalAuthethication.framework (you can search it when you hit +) and call this method after you think user
- /// enter correct username and password
- /// self.saveAccountDetailsToKeychain(account: self.usernameTxtField.text!, password: self.passwordTxtField.text!, completion: {
- /// print("data saved to keychain successfully")
- /// })
- /// hint : it will save username to userdefaults
- import LocalAuthentication
- extension ViewController{
- fileprivate func authenticateUserUsingTouchId() {
- let context = LAContext()
- if context.canEvaluatePolicy(LAPolicy.deviceOwnerAuthenticationWithBiometrics, error: nil) {
- self.evaulateTocuhIdAuthenticity(context: context)
- }
- }
- func evaulateTocuhIdAuthenticity(context: LAContext) {
- guard let lastAccessedUserName = UserDefaults.standard.string(forKey: "lastAccessedUserName") else { return }
- context.evaluatePolicy(LAPolicy.deviceOwnerAuthentication, localizedReason: lastAccessedUserName) { (authSuccessful, authError) in
- if authSuccessful {
- self.loadPasswordFromKeychainAndAuthenticateUser(lastAccessedUserName)
- } else {
- if let error = authError as? LAError {
- self.showError(error: error)
- }
- }
- }
- }
- fileprivate func loadPasswordFromKeychainAndAuthenticateUser(_ account: String) {
- guard !account.isEmpty else { return }
- let passwordItem = KeychainPasswordItem(service: KeychainConfiguration.serviceName, account: account, accessGroup: KeychainConfiguration.accessGroup)
- do {
- let storedPassword = try passwordItem.readPassword()
- atheticateUser(username : account , password : storedPassword)
- } catch KeychainPasswordItem.KeychainError.noPassword {
- print("No saved password")
- } catch {
- print("Unhandled error")
- }
- }
- func atheticateUser(username : String , password : String){
- DispatchQueue.main.async {
- // set your username and password to text fields
- self.usernameTxtField.text = username
- self.passwordTxtField.text = password
- // call your login method
- self.LoginBtnClicked(UIButton())
- }
- }
- func showError(error: LAError) {
- var message: String = ""
- switch error.code {
- case LAError.authenticationFailed:
- message = "Authentication was not successful because the user failed to provide valid credentials. Please enter password to login."
- break
- case LAError.userCancel:
- message = "Authentication was canceled by the user"
- break
- case LAError.userFallback:
- message = "Authentication was canceled because the user tapped the fallback button"
- break
- case LAError.biometryNotEnrolled:
- message = "Authentication could not start because Touch ID has no enrolled fingers."
- break
- case LAError.passcodeNotSet:
- message = "Passcode is not set on the device."
- break
- case LAError.systemCancel:
- message = "Authentication was canceled by system"
- break
- default:
- message = error.localizedDescription
- break
- }
- print(message)
- }
- fileprivate func saveAccountDetailsToKeychain(account: String, password: String , completion : () -> Void) {
- UserDefaults.standard.set(account, forKey: "lastAccessedUserName")
- let passwordItem = KeychainPasswordItem(service: KeychainConfiguration.serviceName, account: account, accessGroup: KeychainConfiguration.accessGroup)
- do {
- try passwordItem.savePassword(password)
- completion()
- } catch {
- print("Error saving password")
- completion()
- }
- }
- }
Add Comment
Please, Sign In to add comment