https://developers.facebook.com/apps/?show_reminder=true
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"를 출력합니다.
'UIKIT' 카테고리의 다른 글
Core Data + FileManager + Combine + MVVM 구조 (0) | 2025.01.24 |
---|---|
Combine 연산자 (0) | 2025.01.16 |
Firebase Firestore를 사용하여 팔로워(follower)와 팔로잉(following) 관계를 처리하는 기능 (0) | 2025.01.10 |
ViewController 내에 init으로 viewModel 할당하는 이유 (0) | 2025.01.10 |
유저를 검색하기 위한 함수 + Combine (0) | 2025.01.10 |