2017-04-08 7 views
0

私はUberクローンtutorialに従っていました。ログイン、登録、ログアウトができますが、パスワードはハッシュ化されていないようです。私はFirebaseデータベースでそれらを明白に見ることができます。Swiftを使用してFirebaseでハッシュパスワードを取得する方法は?

ここに私のコードです。最初のログイン/サインアップ/ログアウト機能は、コントローラーとは別の「プラグイン」フォルダーに保存されています。

import Foundation 
import FirebaseAuth 

typealias LoginHandler = (_ msg: String?) -> Void; 

struct LoginErrorCode { 
    static let INVALID_EMAIL = "Invalid email, please provide a real email address"; 
    static let WRONG_PASSWORD = "Wrong Password, Please Try Again"; 
    static let PROBLEM_CONNECTING = "Problem Connecting to Database. Please Try Later"; 
    static let USER_NOT_FOUND = "User Not Found, Please Register"; 
    static let EMAIL_ALREADY_IN_USE = "Email Already In Use, Please Use Different Email"; 
    static let WEAK_PASSWORD = "Password Should Be At Least 6 Characters"; 
} 

class AuthProvider { 
    private static let _instance = AuthProvider(); 

    static var Instance: AuthProvider { 
     return _instance; 
    } 

    func login(withEmail: String, password: String, loginHandler: LoginHandler?) { 
     FIRAuth.auth()?.signIn(withEmail: withEmail, password: password, completion: { (user, error) in 
      if error != nil { 
       self.handleErrors(err: error as! NSError, loginHandler: loginHandler); 
      } else { 
       loginHandler?(nil); 
      } 
     }) 
    } //login func 

    func signUp(withEmail: String, password: String, loginHandler: LoginHandler?) { 
     FIRAuth.auth()?.createUser(withEmail: withEmail, password: password, completion: { (user, error) in 
      if error != nil { 
       self.handleErrors(err: error as! NSError, loginHandler: loginHandler); 
      } else { 
       if user?.uid != nil { 
        // store the user to database 
        DBProvider.Instance.saveUser(withID: user!.uid, email: withEmail, password: password) 
        //log in the user 
        self.login(withEmail: withEmail, password: password, loginHandler: loginHandler) 
       } 
      } 
     }) 

    } //sign up func 

    func logOut() -> Bool { 
     if FIRAuth.auth()?.currentUser != nil { 
      do { 
       try FIRAuth.auth()?.signOut(); 
       return true; 
      } catch { 
       return false; 
      } 
     } 
     return true 
    } 

    private func handleErrors(err: NSError, loginHandler: LoginHandler?) { 
     if let errCode = FIRAuthErrorCode(rawValue: err.code) { 
      switch errCode { 
      case .errorCodeWrongPassword: 
       loginHandler?(LoginErrorCode.WRONG_PASSWORD); 
       break; 
      case .errorCodeInvalidEmail: 
       loginHandler?(LoginErrorCode.INVALID_EMAIL); 
       break; 
      case .errorCodeUserNotFound: 
       loginHandler?(LoginErrorCode.USER_NOT_FOUND); 
       break; 
      case .errorCodeEmailAlreadyInUse: 
       loginHandler?(LoginErrorCode.EMAIL_ALREADY_IN_USE); 
       break; 
      case .errorCodeWeakPassword: 
       loginHandler?(LoginErrorCode.WEAK_PASSWORD); 
       break; 
      default: 
       loginHandler?(LoginErrorCode.PROBLEM_CONNECTING); 
       break; 
      } 
     } 
    } 
} //class 

とコントローラ:

import UIKit 
import FirebaseAuth 

class SignInVC: UIViewController { 
    private let DRIVER_SEGUE = "DriverVC"; 

    @IBOutlet weak var emailTextField: UITextField! 

    @IBOutlet weak var passwordTextField: UITextField! 


    override func viewDidLoad() { 
     super.viewDidLoad() 


     // Do any additional setup after loading the view. 
    } 

    @IBAction func login(_ sender: Any) { 

     if emailTextField.text != "" && passwordTextField.text != "" { 
      AuthProvider.Instance.login(withEmail: emailTextField.text!, password: passwordTextField.text!, loginHandler: { (message) in 
       if message != nil { 
        self.alertTheUser(title: "Problem With Authentication", message: message!); 
       } else { 
        self.performSegue(withIdentifier: self.DRIVER_SEGUE, sender: nil) 
       } 
      }); 
     } else { 
      alertTheUser(title: "Email And Password Are Required", message: "Please enter email and password"); 
      } 
      } 


    @IBAction func signUp(_ sender: Any) { 
     if emailTextField.text != "" && passwordTextField.text != "" { 
      AuthProvider.Instance.signUp(withEmail: emailTextField.text!, password: passwordTextField.text!, loginHandler: { (message) in 
       if message != nil { 
        self.alertTheUser(title: "Problem With Creating New Account", message: message!) 
       } else { 
        self.performSegue(withIdentifier: self.DRIVER_SEGUE, sender: nil) 
       } 
      }) 
     } else { 
      alertTheUser(title: "Email And Password Are Required", message: "Please enter email and password"); 
     } 
    } 


    private func alertTheUser(title: String, message: String) { 
     let alert = UIAlertController(title: title, message: message, preferredStyle: .alert); 
     let ok = UIAlertAction(title: "OK", style: .default, handler: nil); 
     alert.addAction(ok); 
     present(alert, animated: true, completion: nil) 
    } 


} //class 
+0

私は自分自身を追加する必要がありますか? FirebaseAuthの一部ではありませんか? – Sophia

+0

ハッシュ関数を使用するだけでは不十分で、単に塩を追加するだけでセキュリティを向上させることはほとんどありません。代わりに、約100msの持続時間の間、ランダムな塩でHMACを繰り返し、塩をハッシュで保存してください。 'PBKDF2'、' Rfc2898DeriveBytes'、 'password_hash'、' Bcrypt'などの関数を使用してください。要点は、攻撃者が無差別にパスワードを見つけるのに多くの時間を費やすことです。 – zaph

答えて

0

FIRUserupdatePassword(_ password: String, completion: FirebaseAuth.FIRUserProfileChangeCallback? = nil)を使用してみてください。

関連する問題