본문 바로가기

UIKIT

페이스북 로그인 기능 구현

 

https://developers.facebook.com/apps/?show_reminder=true

 

Facebook

 

business.facebook.com

https://youtu.be/W8NzdN0h50I?si=fwvW92WfBDj__GZZ

 

https://zoeful-log.tistory.com/131

 

[Swift] SwiftUI로 Facebook Login 구현하기

Facebook 공식문서를 보고 정리해 놓은 글입니다. 더 자세한 내용 아래 링크를 참고해 주세요 😊 (오타정정 및 피드백 대환영🙌🏻) https://developers.facebook.com/docs/facebook-login/ios iOS - Facebook 로그인 -

zoeful-log.tistory.com

 

cocopod을 이용해서 firebase + facebook 로그인 기능을 구현할 것 

자세한 순서는 영상 + 블로그 참고 할 것 

 

private let facebookLoginButton: FBLoginButton = {
    let button = FBLoginButton()
    button.permissions = ["email", "public_profile"]
    return button
}()

 

extension LoginViewController: LoginButtonDelegate {
    func loginButton(_ loginButton: FBSDKLoginKit.FBLoginButton, didCompleteWith result: FBSDKLoginKit.LoginManagerLoginResult?, error: (any Error)?) {
        guard let token = result?.token?.tokenString else {
            print("User failed to log in with facebook")
            return
        }
        
        // 페이스북으로 로그인한 유저 정보를 firebase realtime 으로 전달
        let facebookRequest = FBSDKLoginKit.GraphRequest(graphPath: "me",
                                                         parameters: ["fields": "email, name"], tokenString: token,
                                                         version: nil,
                                                         httpMethod: .get)
        facebookRequest.start { _, result, error in
            guard let result = result as? [String: Any], error == nil else {
                print("Failed to make facebook graph request ")
                return
            }
            
            guard let userName = result["name"] as? String,
                  let email = result["email"] as? String else {
                print("Failed to get email and name from fb result")
                return
            }
            
            let nameComponents = userName.map { String($0)}
            
            var firstName: String = ""
            var lastName: String = ""
            
            if nameComponents.count >= 2 {
                lastName = nameComponents.first ?? ""  // 성
                firstName = nameComponents.dropFirst().joined() // 이름
                
            }
            
            DatabaseManager.shared.userExists(with: email) { exists in
                if !exists {
                    DatabaseManager.shared.insertUser(with: ChatAppUser(firstName: firstName ,
                                                                        lastName: lastName,
                                                                        emailAddress: email) )
                }
            }
                    
            
            let credential = FacebookAuthProvider.credential(withAccessToken: token)
            
            FirebaseAuth.Auth.auth().signIn(with: credential) {[weak self] authResult, error in
                guard let strongSelf = self else { return }
                guard authResult != nil, error == nil else {
                    print("Facebook credential login failed")
                    return
                }
                
                print("Success Log in")
                strongSelf.navigationController?.dismiss(animated: true, completion: nil)
            }
            
        }
        
    }
    
    func loginButtonDidLogOut(_ loginButton: FBSDKLoginKit.FBLoginButton) {
        // no operation?
    }
}

 

func loginButton(_ loginButton: FBSDKLoginKit.FBLoginButton, didCompleteWith result: FBSDKLoginKit.LoginManagerLoginResult?, error: (any Error)?) {

 

이 메서드는 사용자가 로그인 버튼을 클릭하고 로그인 과정을 완료했을 때 호출됩니다. 로그인에 성공하면, result에 로그인 결과가 들어오고, error에는 로그인 중 발생한 에러가 포함됩니다.

 

guard let token = result?.token?.tokenString else {
    print("User failed to log in with facebook")
    return
}

 

페이스북 로그인 성공 시, result?.token?.tokenString을 통해 페이스북 액세스 토큰을 가져옵니다. 이 토큰은 Firebase 인증에 사용됩니다. 만약 토큰을 가져올 수 없으면 로그인 실패로 간주하고 메서드를 종료합니다.

 

let facebookRequest = FBSDKLoginKit.GraphRequest(graphPath: "me",
                                                 parameters: ["fields": "email, name"], tokenString: token,
                                                 version: nil,
                                                 httpMethod: .get)


페이스북의 Graph API를 호출하여 사용자의 정보를 요청합니다. 요청할 정보는 "email"과 "name"입니다. tokenString은 앞에서 얻은 페이스북 액세스 토큰이며, 이를 통해 인증된 사용자 정보를 가져올 수 있습니다.

 

DatabaseManager.shared.userExists(with: email) { exists in
    if !exists {
        DatabaseManager.shared.insertUser(with: ChatAppUser(firstName: firstName ,
                                                            lastName: lastName,
                                                            emailAddress: email) )
    }
}

 

Firebase 실시간 데이터베이스에서 해당 이메일로 사용자가 이미 존재하는지 확인합니다. 사용자가 존재하지 않으면, DatabaseManager를 통해 새 사용자를 데이터베이스에 추가합니다. 여기서 ChatAppUser는 사용자 객체로, 이름과 이메일을 포함하는 객체입니다.

let credential = FacebookAuthProvider.credential(withAccessToken: token)

FirebaseAuth.Auth.auth().signIn(with: credential) {[weak self] authResult, error in
    guard let strongSelf = self else { return }
    guard authResult != nil, error == nil else {
        print("Facebook credential login failed")
        return
    }

    print("Success Log in")
    strongSelf.navigationController?.dismiss(animated: true, completion: nil)
}

 

Firebase 인증을 위해 페이스북 로그인에서 얻은 액세스 토큰을 사용하여 credential을 생성하고, 이를 signIn(with: credential)을 통해 Firebase에 인증을 요청합니다. 인증에 성공하면, "Success Log in"을 출력하고 화면을 닫습니다. 인증에 실패하면, "Facebook credential login failed"를 출력합니다.