iOS [iOS] SNS 로그인 연동 개발

[iOS] SNS 로그인 연동 개발

요구사항

  • Facebook 로그인
  • Google 로그인
  • Apple 로그인
  • Kakao 로그인

Third party 설치

# https://firebase.google.com/docs/auth/ios/google-signin?hl=ko
def googleAuth
  pod 'Firebase/Auth'
  pod 'GoogleSignIn'
end

# https://developers.kakao.com/docs/latest/ko/getting-started/sdk-ios
def kakaoAuth
  pod 'KakaoSDKCommon'  # 필수 요소를 담은 공통 모듈
  pod 'KakaoSDKAuth'  # 사용자 인증
  pod 'KakaoSDKUser'  # 카카오 로그인, 사용자 관리
end

# https://developers.facebook.com/docs/facebook-login/ios/?sdk=cocoapods
def facebookAuth
  pod 'FBSDKLoginKit' 
end

프로젝트 설정

  1. 프로젝트에 third party 로 부터 발급받은 id 를 적용하고 SDK를 초기화합니다.
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool
    
  2. Info.plist에 LSApplicationQueriesSchemes 을 등록합니다.

  3. AppDelegate 의 openURL 을 등록합니다.
    func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool
    
  4. 로그인을 구현하고 accessToken 을 확인합니다.

로그인 구현

GoogleLogIn

Apple 플랫폼에서 Google 로그인을 사용하여 인증 Google Sign-In for iOS

import GoogleSignIn
import Firebase

let clientID = FirebaseApp.app()?.options.clientID

// Create Google Sign In configuration object.
let config = GIDConfiguration(clientID: clientID)
GIDSignIn.sharedInstance.signIn(with: config, presenting: presenting) { user, error in
  if let error = error {
    // Error
    return
  }

  guard
    let authentication = user?.authentication,
    let idToken = authentication.idToken
  else {
    // Error
    return
  }

  // 성공
}
  

AppleLogIn

import AuthenticationServices

@available(iOS 13.0, *)
let appleIDProvider = ASAuthorizationAppleIDProvider()
let request = appleIDProvider.createRequest()
request.requestedScopes = [.email]

let authorizationController = ASAuthorizationController(authorizationRequests: [request])
authorizationController.delegate = self
authorizationController.presentationContextProvider = self
authorizationController.performRequests()

@available(iOS 13.0, *)
extension AppleLogIn: ASAuthorizationControllerDelegate {
  /// - Tag: did_complete_authorization
  @available(iOS 13.0, *)
  func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
    switch authorization.credential {
    case let appleIDCredential as ASAuthorizationAppleIDCredential:
      if let identityToken = appleIDCredential.identityToken,
        let appleIdToken = String(data: identityToken, encoding: .utf8) {
        // 성공
      }
    default:
      // Error
    }
  }

  /// - Tag: did_complete_error
  @available(iOS 13.0, *)
  func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) {
    // Cencel
  }
}

@available(iOS 13.0, *)
extension AppleLogIn: ASAuthorizationControllerPresentationContextProviding {
  /// - Tag: provide_presentation_anchor
  @available(iOS 13.0, *)
  func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor {
    return UIApplication.shared.keyWindow!
  }
}

KakaoLogIn

카카오 로그인

import KakaoSDKUser

if UserApi.isKakaoTalkLoginAvailable() {
  UserApi.shared.loginWithKakaoTalk { (oauthToken, error) in
    if let error = error {
      // Error
    } else if let oauthToken = oauthToken {
      // 성공
    }
  }
} else {
  UserApi.shared.loginWithKakaoAccount(prompts: [.Login]) { (oauthToken, error) in
    if let error = error 
      // Error
    } else if let oauthToken = oauthToken {
      // 성공
    }
  }
}

FacebookLogIn

iOS용 Facebook SDK 시작하기 iOS용 Facebook 로그인 - 빠른 시작

import FBSDKLoginKit

let loginManager = LoginManager()
loginManager.logIn(permissions: ["email"], from: self.target) { result, error in
  // Process result or error
  if let error = error {
  // Error
  } else if let result = result {
    if result.isCancelled {
      // Cancel
    } else if let token = result.token {
      // 성공
    }
  }
}

댓글남기기