본문 바로가기

UIKIT/Firebase

🔥 Firebase의 회원가입 (이메일&비밀번호 / 소셜로그인)

// ✅ 소셜 로그인 (Facebook, Google, Apple 등)
func signIn(with credential: AuthCredential) -> AnyPublisher<User, Error> {

    return Future { promise in
        Auth.auth().signIn(with: credential) { authResult, error in
            if let error = error {
                promise(.failure(error))  // 에러 처리
            } else  if let user = authResult?.user {
                promise(.success(user))   // 성공
            }
        }
    }
    .eraseToAnyPublisher()
}


// ✅ 이메일 & 비밀번호로 회원가입 
func registerUser(with email: String, password: String) -> AnyPublisher<User, Error> {

    return Auth.auth().createUser(withEmail: email, password: password)
        .map(\.user)
        .eraseToAnyPublisher()
}

 

1️⃣ signIn(with credential:) → 소셜 로그인

📌 어떤 경우에 사용?

  • Facebook, Google, Apple 로그인 같은 소셜 로그인을 처리할 때 사용
  • credential은 소셜 로그인을 통해 얻은 인증 정보 (AuthCredential 타입)
  • Firebase가 해당 소셜 계정으로 회원가입 또는 로그인을 자동으로 처리
func signIn(with credential: AuthCredential) -> AnyPublisher<User, Error> {
    return Future { promise in
        Auth.auth().signIn(with: credential) { authResult, error in
            if let error = error {
                promise(.failure(error))  // 에러 발생 시
            } else if let user = authResult?.user {
                promise(.success(user))   // 로그인 성공 시
            }
        }
    }
    .eraseToAnyPublisher()
}

 

🔷 사용 예시 (Google 로그인)

// Google 로그인 후 Firebase 인증
let credential = GoogleAuthProvider.credential(withIDToken: idToken, accessToken: accessToken)
signIn(with: credential)
    .sink(receiveCompletion: { completion in
        switch completion {
        case .failure(let error):
            print("소셜 로그인 실패: \(error.localizedDescription)")
        case .finished:
            print("소셜 로그인 성공!")
        }
    }, receiveValue: { user in
        print("로그인한 유저: \(user.email ?? "Unknown")")
    })
    .store(in: &cancellables)
  • credential을 사용하여 Firebase에 로그인 (signIn(with:))
  • 기존 계정이 없으면 자동으로 회원가입됨
  • Future를 사용하여 비동기 작업을 Combine의 Publisher로 변환

https://explorer89.tistory.com/363

 

🤔 소셜 미디어 로그인 방법에서 Future를 사용한 이유?

func signIn(with credential: AuthCredential) -> AnyPublisher { return Future { promise in Auth.auth().signIn(with: credential) { authResult, error in if let error = error { promise(.failure(error)) // 에러 처리 } else if let user = authResult?.user { p

explorer89.tistory.com

 

 

2️⃣ registerUser(with email:password:) → 이메일 회원가입

📌 어떤 경우에 사용?

  • 이메일 & 비밀번호로 회원가입을 처리할 때 사용
  • 사용자가 직접 이메일과 비밀번호를 입력하여 계정을 생성
func registerUser(with email: String, password: String) -> AnyPublisher<User, Error> {
    return Auth.auth().createUser(withEmail: email, password: password)
        .map(\.user) // authResult.user를 추출
        .eraseToAnyPublisher()
}

 

🔷 사용 예시

registerUser(with: "test@example.com", password: "password123")
    .sink(receiveCompletion: { completion in
        switch completion {
        case .failure(let error):
            print("회원가입 실패: \(error.localizedDescription)")
        case .finished:
            print("회원가입 성공!")
        }
    }, receiveValue: { user in
        print("가입한 유저: \(user.email ?? "Unknown")")
    })
    .store(in: &cancellables)

 

  • createUser(withEmail:password:)를 사용하여 Firebase에 새 계정을 생성
  • 이미 존재하는 이메일이면 에러 반환
  • 성공하면 User 객체를 반환
  • Combine의 map(\.user)을 사용하여 authResult.user를 추출하고 Publisher로 반환

 

➡️ 결론:

  • 소셜 로그인은 signIn(with credential:) 사용
  • 이메일 회원가입은 registerUser(with email:password:) 사용