본문 바로가기
IOS - Swift

[iOS/Swift] GoogleLogin구현부터 idToken 내려받기까지

by 게게겍 2023. 3. 3.

구글 로그인

구글 공식문서 보면 전부 진행 가능합니다.

  1. SDK 파일
git clone <https://github.com/google/GoogleSignIn-iOS>

에서 SPM 파일을 다운받으면 되고 CocoaPods 의 경우에는

pod 'GoogleSignIn'

을 입력하고 pod install 을 입력합니다.

다음으로 OAuth를 입력해야 합니다.

  1. Google 개발자 콘솔에서 앱 등록:
    • **Google 개발자 콘솔**에 로그인하고, 새로운 프로젝트를 만듭니다.
    • 프로젝트가 만들어지면, 좌측 메뉴에서 "API 및 서비스" -> "사용자 인증 정보" -> "OAuth 동의 화면"을 클릭하고, "앱 등록"을 합니다.
    • 등록한 앱에 대한 정보를 입력하고, 저장합니다.

다음으로 OAuth 클라이언트 ID 및 맞춤 URL 스킴 추가

발급된 CLIENTID는 두개가 있을텐데 스카마용으로 com.~~~~으로 작성된것은 url type에 작성하고 info.plist 에는 똑바로 적혀있는 id를 작성해줍니다.

  1. 구글 로그인 추가

구글 로그인 기능을 추가하기 위해 Appdelegate에 코드를 추가해줍니다.

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool {
        func application(_ app: UIApplication,open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]
        ) -> Bool {
            
            
            GIDSignIn.sharedInstance.restorePreviousSignIn{
                user, error in
                if error != nil || user == nil {
                    // Show the app's signed-out state.
                } else {
                    // Show the app's signed-in state.
                }
            }
            return true
            
        }
        return false
    }
  1. 원하는 view를 추가하여 Google Login 버튼을 만들어 줍니다.
  2. 사용자 정보를 검색하고 액세스를 승인하기 위해서 GIDGoogleUser 객체를 추가해 줍니다.
//viewController
let signInConfig = GIDConfiguration(clientID:  "클라이언트 id")

@IBAction func signIn(sender: Any) {
        
        GIDSignIn.sharedInstance.signIn(with: signInConfig,presenting:  self) { (user: GIDGoogleUser?, error: Error?) in
            guard error == nil else { return }
            guard let user = user else { return }
            //
            //            user.refreshTokensIfNeeded { (user: GIDGoogleUser?, error: Error?) in
            //                guard error == nil else { return }
            //                guard let user = user else { return }
            
            let idToken = user.authentication.idToken
            
            let emailAddress = user.profile?.email
            
            self.sendIDTokenToServer(idToken: idToken) { data in
                print(data )
            }
        }

저같은 경우에는 login 버튼을 눌럿을 경우 Sign이 가능하게 만들었습니다.

  1. 서버로 idToken 내리기

Post 방식으로 idToken을 추가해주고 정상적으로 받앗는지 확인합니다.

func sendIDTokenToServer(idToken: String?, completion: @escaping (GoogleSignUpModel?) -> ()) {
        
        // 1
        let url = URL(string: "보낼 서버 주소url")! // 서버 URL
    
        //2
        var request = URLRequest(url: url)
        request.httpMethod = "POST"
        
        //3
        let token = ["token": idToken]
        request.addValue("application/json", forHTTPHeaderField: "Content-Type")
        
       
           // 4 json encoding 하기
        do {
            let jsonData = try JSONSerialization.data(withJSONObject: token, options: [.prettyPrinted])
            
            // 5 바디에 담기
            request.httpBody = jsonData
            
        } catch {
            print(error)
        }
        
        //요청 6
        let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
            
            if let error = error {
                completion(nil)
            }
            
            //7 되면 말하기
            if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {
                print("Error: HTTP status code \\(httpStatus.statusCode)")
                return
            }
            
            if let jsonData = data {
                do {
                    let decode = JSONDecoder()
                    let responseData = try decode.decode(GoogleSignUpModel.self, from: jsonData)
                    
                    completion(responseData)
                    
                } catch {
                    completion(nil)
                }
            }
        }
        
        task.resume() //보내고
    }

urlSession으로 주고받는 과정을 번호 순서로 담았으니 참고바랍니다.