APP-iOS3rd / PJ3T2_Mymory

멋쟁이사자처럼 iOS 앱스쿨 3기 팀 프로젝트
10 stars 3 forks source link

[Add] 구글 로그인 기능 및 파이어베이스 연결 #153

Closed Ahario closed 7 months ago

Ahario commented 7 months ago

PR 가이드라인

PR Checklist

PR 날릴 때 체크 리스트

PR Type

어떤 종류의 PR인가요?

연관되는 issue 정보를 알려주세요

Issue Number: N/A

PR 설명하기

구글 로그인 기능을 만들었습니다. 구글의 로그인 sdk를 이용하여 뷰 -> 구글 로그인 페이지를 연결하였고, 받아온 정보를 파이어베이스 로직을 이용해서 데이터베이스에 저장하는식으로 구현하였습니다.

어떻게 작동하나요? code 기반으로 설명해주세요

                        GIDSignIn.sharedInstance.signIn(withPresenting: check) { signResult, error in
                            if let error = error {
                                print("구글 로그인 에러입니다\(error)")
                                return
                            } else {
                                guard let user = signResult?.user, let idToken = user.idToken else { return }
                                     let accessToken = user.accessToken
                                     let credential = GoogleAuthProvider.credential(withIDToken: idToken.tokenString, accessToken: accessToken.tokenString)
                                Task {
                                    if let alertTitle = await self.viewModel.loginWithGoogle(credential: credential) {
                                        print(alertTitle)
                                        return
                                    } else {
                                        presentationMode.wrappedValue.dismiss()
                                    }
                                }

                            }
                        }

    func loginWithGoogle(credential: AuthCredential) async -> String? {
        do {
            let result = try await Auth.auth().signIn(with: credential)
            let newUserCheck = await checkUser(userID: result.user.uid)
            if newUserCheck {
                let data = [
                    "id" : result.user.uid,
                    "name": result.user.displayName,
                    "email": result.user.email,
                    "profilePicture": ""
                ]
                COLLECTION_USERS.document(result.user.uid).setData(data) { _ in
                    self.userSession = result.user
                    self.fetchUser()
                }
                print("계정생성 성공")
            } else {
                self.userSession = result.user
                self.fetchUser()
            }
            return nil
        } catch {
            return ("구글 로그인 실패")
        }
    }

    func checkUser(userID: String) async -> Bool {
        do {
            let querySnapshot = try await Firestore.firestore().collection("users")
                .whereField("id", isEqualTo: userID).getDocuments()
            if querySnapshot.isEmpty {
                return true
            } else {
                return false
            }
        } catch {
            return true
        }
    }

구글로그인 SDK를 이용해서 미리 지정한 URLSCHEME을 통해 구글 로그인페이지로 이동합니다. 로그인 성공시 받은 토큰을 이용하여 credential를 받습니다.

받은 credential을 이용하여 파이어베이스 로그인 함수를 이용하여 로그인을 합니다

만약 신규유저일지 데이터베이스에 추가해줍니다


스크린샷

메일이 포함되있는 화면이라 스크린샷은 저희 디코방에 올리겠습니다.

기타 언급해야 할 사항들

Ahario commented 7 months ago

아 현재는 디자인정책에 맞는 스타일로 버튼모양이 되어있습니다. 테스트해보고 문제가 없으면 디자인을 저희 디자인 스타일로 변경하겠습니다.