https://medium.com/@greenSyntax/single-sign-on-on-ios-cc0af3d03aaa 요거 보고 번역 정리 한 글 자세한건 저 link gogo
SSO란 1회 사용자 인증으로 다수의 앱 및 웹에 대한 사용자 로그인을 허용하는 인증 솔루션입니다. - Amazon
파이어베이스를 프로젝트에 적용해야합니다. 그리고 Authenticaition에 Google, Apple을 추가해줌니다. 그 후에 구글 230로그인을 위해 프로젝트에 URL Scheme을 추가해줘야하는데 구글 서비스 plist에 있는 REVERSED_CLIENT_ID를 추가해줍니다.
페북, 구글, 애플, 트위터, 깃헙 등 다양한 소셜 계정에 대한 SSO를 달성하는데 동무이 되는 Firebase 인증을 사용할것입니다. 추가해야할 패키지는 아래와 같습니다.
pod 'FirebaseAnalytics'
pod 'FirebaseAuth'
pod 'Firebase'
pod 'GoogleSignIn'
이제 인증 모듈이 프로젝트에 추가되었고, 인증 레이어를 구현할 준비가 되었습니다. 여기서는 구글과 애플의 인증 계층의 통신에 델리게이트 패턴을 사용함니다
struct AppUser {
var token: String
var name: String
var email: String
var userId: String
var imagePath: URL?
}
protocol SocialAuthenticationDelegate: AnyObject {
func onAuthenticationSuccess(_ user: AppUser)
func onAuthenticationError(_ error: Error)
}
구글 인증에서는 파이어베이스 ClientID가 필요합니다.
class GoogleAuthentication {
weak var delegate: SocialAuthenticationDelegate?
func signIn(_ vc: UIViewController, delegate: SocialAuthenticationDelegate) {
guard let clientID = FirebaseApp.app()?.options.clientID else { return }
self.delegate = delegate
let config = GIDConfiguration(clientID: clientID)
GIDSignIn.sharedInstance.configuration = config
GIDSignIn.sharedInstance.signIn(withPresenting: vc) { [unowned self] user, error in
if let error = error {
self.delegate?.onAuthenticationError(AppError.custom(error.localizedDescription))
return
}
guard let token = user?.user.accessToken, let idToken = user?.user.idToken else { return }
let credential = GoogleAuthProvider.credential(withIDToken: idToken.tokenString, accessToken: token.tokenString)
Auth.auth().signIn(with: credential) { (auth, error) in
if let error = error {
debugPrint("Auth Error: \(error.localizedDescription)")
self.delegate?.onAuthenticationError(AppError.custom(error.localizedDescription))
} else {
self.delegate?.onAuthenticationSuccess(AppUser(token: auth?.user.providerID ?? "", name: auth?.user.displayName ?? "",
email: auth?.user.email ?? "", userId: auth?.user.uid ?? "", imagePath: auth?.user.photoURL))
}
}
}
}
}
그리고 이 친구는 뷰 모델에서 부른다고 했으니까 뷰 모델과 뷰 컨트롤러의 코드는 아래와 같슴니다. Delegate 패턴을 사용하기 때문에 채택을 한 후 구현부를 여기 작성해줌니다. 그리고 프로퍼티로 클로저를 만들어서 처리를 하고 있는 모습이네요.
// VM
class AuthenticationViewModel: AuthenticationViewModelType {
private var google: GoogleAuthentication
var handlerAuthenticationSuccessfull: ((_ user: AppUser) -> Void)?
var handlerAuthenticationFailure: ((_ error: AppError) -> Void)?
init(_ google: GoogleAuthentication) {
self.google = google
}
func initializeGoogleLogin(_ vc: UIViewController) {
google.signIn(vc, delegate: self)
}
}
extension AuthenticationViewModel: SocialAuthenticationDelegate {
func onAuthenticationSuccess(_ user: AppUser) {
self.handlerAuthenticationSuccessfull?(user)
}
func onAuthenticationError(_ error: Error) {
self.handlerAuthenticationFailure?(.error(error))
}
}
// VC에서는 이렇게 호출만 하면 됩니당
@IBAction func actionButtonGoogle(_ sender: Any) {
viewModel.initializeGoogleLogin(self)
}
애플 인증도 구글 인증과 거의 유사합니다. 다만 보일러 플레이트 코드가 좀 많긴 합니다 이 부분은 이 글 맨 위의 작성한 링크를 들어가서 확인해주시길 바람니다..! 파이어베이스 공식 문서에도 있슴니다
뷰 모델에 구글 인증에서 했던 것처럼 initialAppleLogin()
함수를 추가해주어서 애플 로그인 플로우를 수행하면 됩니다. 마찬가지로 뷰 컨트롤러에서도 위 함수를 수행하게끔 해주면 끗임니다 !
주의해야할 문제들은 아래와 같슴니다.
REVERSED_CLIENT_ID
를 확인하세요