(UIKit) iOS에서 UIKit으로 Google 로그인

문제 상황

오류가 있는지 확인하기 위해 문서를 살펴보고 이전에 보았던 예제를 참조하여 Firebase를 사용하여 Google 로그인 버튼을 구현하려고 했습니다.

2022년 예시임에도 불구하고 AppDelegate with Delegate의 작업은 대폭 줄어들었고, 로직을 구현하는 ViewController의 역할은 늘어났습니다.

현재 다음 코드는 AppDelegate가 수행하는 모든 코드입니다.

func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: (UIApplication.LaunchOptionsKey: Any)?
    ) -> Bool {
        FirebaseApp.configure()
        ...
        return true
    }


func application(_ app: UIApplication,
                 open url: URL,
                 options: (UIApplication.OpenURLOptionsKey: Any) = (:)) -> Bool {
  return GIDSignIn.sharedInstance.handle(url)
}

해결하다

먼저 GoogleSignIn을 가져옵니다.

import GoogleSignIn

다음으로 버튼을 선언하고 UI에 액세스합니다.

private let googleLoginButton = GIDSignInButton()

타겟 설정 버튼을 통해 발생하는 이벤트를 정의해 봅시다.

클라이언트 ID를 수신하고 구성을 설정합니다.

이를 통해 사용자의 idToken 및 프로필 정보를 추출할 수 있습니다.

핵심은 GoogleAuthProvider에서 자격 증명을 가져오는 것이며 Firebase에 다시 주입하여 로그인을 구현할 수 있습니다.

@objc
    private func googleSignIn() {
        guard let clientID = FirebaseApp.app()?.options.clientID else { return }
        let config = GIDConfiguration(clientID: clientID)
        GIDSignIn.sharedInstance.configuration = config
        
        GIDSignIn.sharedInstance.signIn(withPresenting: self) { (unowned self) result, error in
            
            if let error = error {
                print(error.localizedDescription)
                return
            }
            guard
                let user = result?.user,
                let idToken = user.idToken?.tokenString else { return }
            
            
            let credential = GoogleAuthProvider.credential(withIDToken: idToken,
                                                             accessToken: user.accessToken.tokenString)
            
            FirebaseAuth.Auth.auth().signIn(with: credential, completion: { (weak self) result, error in
                
                guard
                    result !
= nil, error == nil else { if let error = error { print("Google credential login failed") } return } print("Successfully logged user in") }) } }

위의 코드는 공식 문서에도 나와 있는 기본 코드입니다.

정상적인 로그인에서는 탐색이나 닫기를 구현하면서 사용자 정보를 추출하는 것이 일반적입니다.

제 경우에는 코드가 너무 지저분해서 위의 코드만 올립니다.