ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [4]_1_1. (Firebase) e-mail / password를 이용한 가입 / 로그인 / 로그아웃
    서버/1.(Firebase) Authentication 2022. 7. 20. 15:49

     

     

     

     

     

     

     

    Firebase > 빌드 > Authentication에서 로그인에 사용할 method를 선택 / 추가할 수 있다.

     

    우선 Email과 비밀번호로를 이용한 방법부터 도전!

     

    다만, 여기서 사용하는 이메일이 정말로 존재하는 것인지 인증하는 것도 필요한 스텝이라고 생각하는데 이는 차후로 미루자.

     

     

     

     

     

    import FirebaseAuth

    가입/로그인/로그아웃 과정에는  Auth 클래스?객체?를 많이 사용하는데 이때 필요한 라이브러리는 "FirebaseAuth"이다. 기억하자.

     

     

     

     

     


    가입

     

    이제 이 기능이 실사용될 곳에 코드를 작성한다.

     

    가입에 사용할 코드는 Auth.auth()에 있는 createUser(withEmail: password: completion)이다.

                        cf) firebase 제공 기본 기능

                              1) 'email'에 @가 없으면 올바른 텍스트로 인정하지 않는다.

                              2) 'password'가 6자 이상이지 않으면 에러를 던진다.

                             이 에러들은 아직까지는 알 수 없고, error 메세지를 받아야 확인할 수 있다.

        @IBAction func tabBtnNext(_ sender: UIButton) {
            let email = tfEmail.text ?? ""
            let password = tfPassword.text ?? ""
            Auth.auth().createUser(withEmail: email, password: password) { authDataResult, error in
                self.showMainViewViewController()
            }
        }
        
        func showMainViewViewController() {
            let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)
            let viewController = storyboard.instantiateViewController(withIdentifier: "WelcomeViewController")
            viewController.modalPresentationStyle = .fullScreen
            navigationController?.show(viewController, sender: nil)    
        }

     

     

     

     

     


    로그인

     

    실제 서비스에서 가입/로그인을 구현할 때는 각각의 버튼을 따로 만들 거라 생각한다.

     

    다만 가입에서 이미 있는 이메일을 입력할 경우 경고 메세지를 파악하여 로그인으로 돌리는 절차를 위해 가입과 로그인을 같은 버튼으로 처리해보자.

     

    위 가입에서 작성한 코드를 아래와 같이 수정한다.

        @IBAction func tabBtnNext(_ sender: UIButton) {
            let email = tfEmail.text ?? ""
            let password = tfPassword.text ?? ""
            Auth.auth().createUser(withEmail: email, password: password) { authDataResult, error in        
                if let error = error {
                    let code = (error as NSError).code
                    switch code {
                    case 17007:
                        self.loginUser(withEmail: email, password: password)
                    default:
                        self.lblErrorMessage.text = error.localizedDescription
                    }
                } else {
                    self.showMainViewViewController()
                }
            }
        }
        
        private func loginUser(withEmail email: String, password: String) {
            Auth.auth().signIn(withEmail: email, password: password) { authDataResult, error in      
                if let error = error {
                    self.lblErrorMessage.text = error.localizedDescription
                } else {
                    self.showMainViewViewController()
                }
            }
        }

    여기서 firebase에서 던져준 error cdoe 17007은 "이미 가입된 이메일 주소"이다.

     

    이는 아래처럼 BreakPoint를 걸고, 실제 앱을 실행한 뒤 던져지는 error를 확인하면 파악할 수 있다.

     

    콘솔 창 오른쪽에 "po error"를 입력하면 17007 코드 및 내용을 확인할 수 있다.

     

     

     

     

     

    그렇다면 이제 error code가 17007인 경우를 로그인으로 돌리면 된다. 

     

    로그인에 사용한 명령어는 signIn(withEmail: password: completion:)이다.

     

    이때도 비밀번호가 틀렸거나 할 수 있으니 에러를 처리하도록 하자.  (위에 작성한 걸 다시 한 번 가져와 본다.)

        private func loginUser(withEmail email: String, password: String) {
            Auth.auth().signIn(withEmail: email, password: password) { authDataResult, error in      
                if let error = error {
                    self.lblErrorMessage.text = error.localizedDescription
                } else {
                    self.showMainViewViewController()
                }
            }
        }

     

     

     

     

     


    로그아웃

     

    로그아웃이야, 버튼에 아래처럼만 입력하면 될 줄 알았다. 

    Auth.auth().signout()

     

     

     

     

     

    우선은 do try문을 사용할 때를 아직 잘 모르니 명령어까지만 알아두자.

        @IBAction func tabBtnLogout(_ sender: UIButton) {
            let firebaseAuth = Auth.auth()
            do {
                try firebaseAuth.signOut()
                self.navigationController?.popToRootViewController(animated: true)
            } catch let signOutError as NSError {
                print("Error: singout \(signOutError.localizedDescription)")
            }
        }

     

     

     

     

     

    이제 로그인을 하면 이렇게 Firebase 사이트에서 확인할 수 있다.

Designed by Tistory.