본문 바로가기
iOS/iOS

[iOS] Firebase를 활용한 로그인

by 원만사 2022. 1. 13.
반응형

 

 

Firebase란?

 모바일 서버를 개발하기 위해서는 인증, 데이터베이스, 푸시 알람, 스토리지, API등 모든 것을 개발해야 한다. 하지만 모바일 서버는 이런 모든 것을 구성하는데 구성하는 범위가 매번 새로운 앱들과 차이 나지 않기 때문에 리눅스를 설치하고, FTP를 설치하고, 데이터베이스를 설치하는 등 이런 반복적인 작업을 앱을 개발 할 때마다 하는 것은 엄청난 시간낭비라고 볼 수 있다. 

 

 Firebase는 이 모든 플랫폼을 프로젝트 구축 시 자동적으로 만들어 준다. 또한 서버를 구축하기 위해서 리눅스 명령어를 알 필요도 없으며 도메인을 구입할 필요도 없고 개발하는 동안에는 서버를 구입할 필요도 없다. 

 

 Firebase에는 인증, 데이터베이스, 스토리지, 원격 구성, 푸시 알람등의 대표적인 기능이 있는데 이번 포스팅에서는 인증(Auth) 기능을 통해서 로그인을 하는 것을 간단하게 알아볼 것이다. 

 

Firebase 사용 준비하기

 먼저 CocoaPods을 통해 프로젝트에서 Firebase의 Auth 기능을 사용할 수 있도록 구성해보자. Podfile에 다음을 추가한 후 설치를 진행한다.

pod 'Firebase/Auth'

 

 그 후 Firebase의 콘솔로 가서 새로운 프로젝트를 추가한다. 프로젝트 추가가 완료되고 나면 다음 화면에서 iOS를 선택하여 앱을 추가한다. 

 

 다음 화면에서 아래의 Bundle Identifier를 입력한 후 앱을 등록한다.

 

 앱이 등록되고 나면 GoogleService-Info.plist 파일을 다운로드 받아서 프로젝트의 경로에 추가한다. 그 후 프로젝트의 AppDelegate.swift에서 다음과 같이 Firebase를 초기화해준다.

import UIKit
import Firebase // Firebase를 import 해준다.

@main
class AppDelegate: UIResponder, UIApplicationDelegate {
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        
        // Firebase 초기화
        FirebaseApp.configure()
    
        return true
    }
}

 

 다시 Firebase로 돌아가서 메뉴의 Authentication에서 시작하기를 누른 후 로그인 제공업체에서 사용할 로그인 방법을 선택하면 된다. 이번 포스팅에서는 기본 제공업체인 이메일/비밀번호를 사용해보자. 이메일/비밀번호를 누르고 사용 설정으로 바꾼 뒤 저장을 눌러주면 Firebase의 Auth를 사용할 준비가 완료된다. 

 

로그인 구현

 이메일과 비밀번호를 입력하면 로그인이 되도록 구성해보자. 적절한 이메일과 비밀번호를 입력한 후 로그인을 했을 때 만약 아직 가입되어 있지 않은 이메일이라면 새로운 유저를 만들고 로그인이 진행되고 이미 가입한 이메일이라면 새로운 유저를 생성하지 않고 로그인이 된다. 

 

새로운 유저 회원가입

 로그인 버튼을 눌렀을 때 다음과 같은 함수가 실행된다.

    @IBAction func tapLoginButton(_ sender: UIButton) {
        let email = emailTextField.text ?? ""
        let password = passwordTextField.text ?? ""
        
        
        // 신규 사용자 생성
        Auth.auth().createUser(withEmail: email, password: password) { [weak self] result, error in
            guard let self = self else { return }
            
            if let error = error {
                let code = (error as NSError).code
                
                switch code {
                case 17007: // 이미 가입한 계정일 때
                    self.userLogin(email: email, password: password)
                    
                default:
                    self.errorLabel.text = error.localizedDescription
                }
            } else {
                self.loginSuccess()
            }
        }
    }

 

 새로운 유저를 생성하기 위해서는 createUser(withEmail:password:completionHandler:) 메서드가 사용된다. 이메일과 패스워드를 입력받고 completionHandler가 실행된다. 이때 17007 에러에 대한 처리를 볼 수 있는데 이는 이미 등록된 유저일 경우 새로운 유저를 생성하지 않고 해당 아이디로 로그인을 진행하기 위해서이다. 

 

기존 유저 로그인

 이미 가입된 아이디로 로그인하기 위해서는 다음과 같은 코드가 사용된다.

    private func loginSuccess() {
        guard let vc = self.storyboard?.instantiateViewController(withIdentifier: "AfterLoginViewController") as? AfterLoginViewController else { return }
        
        vc.modalPresentationStyle = .fullScreen
        self.navigationController?.show(vc, sender: nil)
    }
	
    private func userLogin(email: String, password: String) {
        Auth.auth().signIn(withEmail: email, password: password) { [weak self] _, error in
            guard let self = self else { return }
            
            if let error = error {
                self.errorLabel.text = error.localizedDescription
            } else {
                self.loginSuccess()
            }
        }
    }

 

 이번에는 signIn(email:password:completionHandler:) 메서드가 사용되었다. 로그인 과정에서 에러가 발생하지 않았다면 로그인 완료 화면을 불러온다.

 

로그아웃 하기

 로그아웃의 경우 signOut() 메서드를 사용한다. 에러가 발생하지 않고 로그아웃에 성공했다면 root뷰로 돌아간다.

    @IBAction func tapLogoutButton(_ sender: UIButton) {
        do {
            try Auth.auth().signOut()
            self.navigationController?.popToRootViewController(animated: true)
        } catch let error {
            debugPrint("\(error.localizedDescription)")
        }
    }

 

 

 

References

- https://beomseok95.tistory.com/106

 

반응형

댓글