구글 사인인 패키지 다운 받아야함

그리고 info 리스트에 URL Type추가해줘야함

구글인포에 있는 Reversed Client ID 저 위에 URL Schemes에 추가해주면 됩니다
구글 버튼부터 만들어봅시다


그 후에 AuthenticationViewModel을 만들어줌!

근데 지금 withPresenting에 UIViewController가 필요함!
SwiftUI에서 사용하려면 최상위 뷰를 찾고 SwiftUI의 View에 맞게 바꿔주는 과정이 필요하겠죠
StackOverFlow: get top most uiviewController
를 검색해보면 됨
import Foundation
import UIKit
final class Utilities {
static let shared = Utilities()
private init() { }
@MainActor
func topViewController(controller: UIViewController? = nil) -> UIViewController? {
let controller = controller ?? UIApplication.shared.keyWindow?.rootViewController
if let navigationController = controller as? UINavigationController {
return topViewController(controller: navigationController.visibleViewController)
}
if let tabController = controller as? UITabBarController {
if let selected = tabController.selectedViewController {
return topViewController(controller: selected)
}
}
if let presented = controller?.presentedViewController {
return topViewController(controller: presented)
}
return controller
}
}
topView찾는 Utilities 클래스를 만들었다

GoogleSignInResult를 signIn메소드를 사용해서 가져올 수 있게됨!

Firebase 문서를 보면 결국 credential이라는 곳에 저장하는 걸 볼 수 있음

FirebaseAuth를 추가해주고
.credential에 withIDToken과 accessToken이 필요한 걸 알 수 있음
import SwiftUI
import GoogleSignIn
import GoogleSignInSwift
import FirebaseAuth
@MainActor
final class AuthenticationViewModel: ObservableObject {
func signInGoogle() async throws {
guard let topVC = Utilities.shared.topViewController() else {
throw URLError(.cannotFindHost)
}
let gidSignInResult = try await GIDSignIn.sharedInstance.signIn(withPresenting: topVC)
guard let idToken = gidSignInResult.user.idToken?.tokenString else {
throw URLError(.badServerResponse)
}
let accessToken = gidSignInResult.user.accessToken.tokenString
let credential = GoogleAuthProvider.credential(withIDToken: idToken, accessToken: accessToken)
}
}
signInGoogle()을 하게되면 gidSignInResult를 가져올 수 있고,
이 Result의 user의 idToken과 accessToken을 가져와서
credential을 구성해주게됨


AuthenticationManager를 두가지로 구분지어주고
Sign In SSO같은 경우 통합 인증을 이야기함
1회 사용자 인증으로 애플리케이션 및 웹사이트에 대한 사용자로그인을 허용하는 인증 솔루션!
좀 효율적으로 바꿔봅시다

SignInResult 모델을 만들고


이 토큰이 넘겨지게끔 해줌
결국 GoogleResult의 토큰들을 받아서 AuthDataResultModel로 반환이 되게끔 해주는 거겠죠!

버튼에 로직 작성해주고

GIDClientID 인포에서 추가해줍니다.
Google plist의 clientID추가해주면 됨
그리고 로그인 하면됩니다~
마찬가지로 currentUser에 대한 정보에 따라서 뷰가 뜨게 됨
GoogleSignIn은 따로 createUser같은 건 없고 SignIn하면 바로 계정 생성이 되네요
Generic하게 쓸 수 있게 만들어 줍시다


ViewModel에서 SignInGoogleHelper를 가져오고
token을 AuthenticationManager에 전달해주면 됨
더리유저블 하게 사용한 걸 보려면
https://gist.github.com/swiftfulthinking
여길로!
지금 구글 로그인 했을 때 문제점 하나는
Email Functions가 나오고 있다는거!


AuthManager에서 로그인한 provider가 어떤 건지 알수 있게 만들어주는 메소드를 작성





그려지는 시점에서 .onAppear의 순서에 버그가 있어서 !showSignInView가 false가 확실할 때만 뷰가 그려지게 해줌

gidSignInResult를 가지고 올 때 name이랑 email정보를 가지고 올 수 있음


token 보낼 때 실어주면됨