Guest User

Untitled

a guest
Dec 29th, 2018
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.96 KB | None | 0 0
  1. /// created by amir tutunchi
  2.  
  3. /// usage : to use this snippets of code go to project setting and in build phases in Link Binary With Libraries
  4. /// add LocalAuthethication.framework (you can search it when you hit +) and call this method after you think user
  5. /// enter correct username and password
  6. /// self.saveAccountDetailsToKeychain(account: self.usernameTxtField.text!, password: self.passwordTxtField.text!, completion: {
  7. /// print("data saved to keychain successfully")
  8. /// })
  9. /// hint : it will save username to userdefaults
  10.  
  11. import LocalAuthentication
  12.  
  13. extension ViewController{
  14. fileprivate func authenticateUserUsingTouchId() {
  15. let context = LAContext()
  16. if context.canEvaluatePolicy(LAPolicy.deviceOwnerAuthenticationWithBiometrics, error: nil) {
  17. self.evaulateTocuhIdAuthenticity(context: context)
  18. }
  19. }
  20. func evaulateTocuhIdAuthenticity(context: LAContext) {
  21. guard let lastAccessedUserName = UserDefaults.standard.string(forKey: "lastAccessedUserName") else { return }
  22. context.evaluatePolicy(LAPolicy.deviceOwnerAuthentication, localizedReason: lastAccessedUserName) { (authSuccessful, authError) in
  23. if authSuccessful {
  24. self.loadPasswordFromKeychainAndAuthenticateUser(lastAccessedUserName)
  25. } else {
  26. if let error = authError as? LAError {
  27. self.showError(error: error)
  28. }
  29. }
  30. }
  31. }
  32. fileprivate func loadPasswordFromKeychainAndAuthenticateUser(_ account: String) {
  33. guard !account.isEmpty else { return }
  34. let passwordItem = KeychainPasswordItem(service: KeychainConfiguration.serviceName, account: account, accessGroup: KeychainConfiguration.accessGroup)
  35. do {
  36. let storedPassword = try passwordItem.readPassword()
  37. atheticateUser(username : account , password : storedPassword)
  38. } catch KeychainPasswordItem.KeychainError.noPassword {
  39. print("No saved password")
  40. } catch {
  41. print("Unhandled error")
  42. }
  43. }
  44. func atheticateUser(username : String , password : String){
  45. DispatchQueue.main.async {
  46. // set your username and password to text fields
  47. self.usernameTxtField.text = username
  48. self.passwordTxtField.text = password
  49. // call your login method
  50. self.LoginBtnClicked(UIButton())
  51. }
  52. }
  53. func showError(error: LAError) {
  54. var message: String = ""
  55. switch error.code {
  56. case LAError.authenticationFailed:
  57. message = "Authentication was not successful because the user failed to provide valid credentials. Please enter password to login."
  58. break
  59. case LAError.userCancel:
  60. message = "Authentication was canceled by the user"
  61. break
  62. case LAError.userFallback:
  63. message = "Authentication was canceled because the user tapped the fallback button"
  64. break
  65. case LAError.biometryNotEnrolled:
  66. message = "Authentication could not start because Touch ID has no enrolled fingers."
  67. break
  68. case LAError.passcodeNotSet:
  69. message = "Passcode is not set on the device."
  70. break
  71. case LAError.systemCancel:
  72. message = "Authentication was canceled by system"
  73. break
  74. default:
  75. message = error.localizedDescription
  76. break
  77. }
  78. print(message)
  79. }
  80. fileprivate func saveAccountDetailsToKeychain(account: String, password: String , completion : () -> Void) {
  81. UserDefaults.standard.set(account, forKey: "lastAccessedUserName")
  82. let passwordItem = KeychainPasswordItem(service: KeychainConfiguration.serviceName, account: account, accessGroup: KeychainConfiguration.accessGroup)
  83. do {
  84. try passwordItem.savePassword(password)
  85. completion()
  86. } catch {
  87. print("Error saving password")
  88. completion()
  89. }
  90. }
  91. }
Add Comment
Please, Sign In to add comment