Swift Firebase Google Auth 로그인 하기
최근 개발중인 앱을 Firebase과 연동하여 만들고 있는데,
구글로 로그인 하는 것에 꽤 애를 먹었다.
알고보니 Firebase도 그렇고 Swift도 그렇고 자주 바뀌어 해결하는게 쉽지 않았다.
공식 문서를 보며 작성을 잘 하였지만, 중간에 막히는 바람에..
차근차근 안내해주겠다.
-
Authentication에서 Google을 활성화 시켜준다.
프로젝트 지원 이메일은 자신의 이메일을 쓰면 되고, 다른 것은 건드리지 않으면 된다. - Firebase와 프로젝트가 이미 연동이 되어 있어 Podfile이 있다는 가정하에 글을 쓰고 있다.
Podfile에서 아래의 코드를 추가 해준다.pod 'Firebase/Auth' pod 'GoogleSignIn'
- AppDelegate와 자신의 로그인을 구현할 ViewController에 아래의 코드를 import 해준다.
import Firebase
import GoogleSignIn
-
Firebase와 프로젝트를 연동하면서 그때 가져온 GoogleService-Info.plist 파일을 열어, REVERSED_CLIENT_ID 키를 복사하여 화면에 보이는 곳에 그대로 붙여넣어 준다.
URL Schemes 이외에 다른 것들은 건드리지 않도록 한다. - AppDelegate의 didFinishLauching 부분에 아래의 코드를 추가해준다.
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. FirebaseApp.configure() // 이 한줄! return true }
- AppDelegate에서 아래의 코드를 추가해주자.
나는 5번의 코드 바로 밑에다가 추가하였다.
@available(iOS 9.0, *)
func application(_ application: UIApplication, open url: URL,
options: [UIApplication.OpenURLOptionsKey: Any])
-> Bool {
return GIDSignIn.sharedInstance.handle(url)
}
- Storyboard에서 구글 로그인 버튼을 생성하고 ViewController에 추가를 해준다.
(IBOutlet과 Action 두 형태로)
Firebase 공식 문서에서는 버튼을 선언할 때, 아래의 형식으로 선언하라고 하였지만, 나는 signInButton이라 하면 다른 방법들과 구분하기 어려워 그냥 googleLogin이라고 이름을 설정하였지만 문제없이 잘 되었다.
@IBOutlet weak var signInButton: GIDSignInButton!
마지막으로 내가 막혔던 부분이다.
구글 로그인을 한 정보를 바탕으로 Firebase에도 인증을 하여야 최종적으로 완성이 되는데, 이 부분의 코드를 공식 문서를 그대로 복사하여 붙여놓으니 되지 않았다.
아래의 코드를 이전 단계의 가장 밑 부분에 붙여놓으면 된다.
한 눈에 보기 쉽게 8번 과정의 코드와 함께 다시 적겠다.
guard let clientID = FirebaseApp.app()?.options.clientID else { return }
// Create Google Sign In configuration object.
let config = GIDConfiguration(clientID: clientID)
// Start the sign in flow!
GIDSignIn.sharedInstance.signIn(with: config, presenting: self) { [unowned self] user, error in
if let error = error {
// ...
return
}
guard
let authentication = user?.authentication,
let idToken = authentication.idToken
else {
return
}
let credential = GoogleAuthProvider.credential(withIDToken: idToken,
accessToken: authentication.accessToken)
// Firebase 로그인
Auth.auth().signIn(with: credential) { authResult, error in
if let error = error {
print("Firebase sign in error: \(error)")
return
} else {
print("User is signed with Firebase&Google!")
self.changeView("Main", "ViewController")
}
}
}
+) 마지막 줄의 self.changeView(“Main”, “ViewController”)는 로그인 성공시, View 변환을 위해 추가한 것이다.
ChangeView 함수를 직접 만들었는데, 매우 유용하여 이에 대한 코드를 아래에 남겨둘테니 참고하면 좋을 듯 하다.
public func changeView(_ storyBoardName : String,_ viewControllerName : String)
{
let stb = UIStoryboard(name: storyBoardName, bundle: nil)
let rootVC = stb.instantiateViewController(withIdentifier: viewControllerName)
let snapshot = (UIApplication.shared.keyWindow?.snapshotView(afterScreenUpdates: true))!
rootVC.view.addSubview(snapshot)
UIApplication.shared.keyWindow?.rootViewController = rootVC
UIView.transition(with: snapshot,
duration: 0.4,
options: .transitionCrossDissolve,
animations: {
snapshot.layer.opacity = 0
},
completion: { status in
snapshot.removeFromSuperview()
})
}
댓글남기기