파이어베이스 애플 로그인 연동

RYEOL·2024년 2월 7일

Swift

목록 보기
5/14
post-thumbnail

Firebase 를 통해서 AppleSignin기능 구현에 대한 설명

파이어베이스, 애플 로그인 세팅

파이어 베이스 세팅 관련해서는 추후 다른 로그인 서비스 관련해서 포스팅 예정
이번 포스팅에서는 애플 로그인 관련된 코드만 다룰 예정

Xcode 세팅

  1. Xcode Target 에서 Signing & Copabilities 항목에 들어간다!
  2. +Copability 버튼을 누른다!
  3. Sign in with Apple를 추가한다

    위처럼 추가되면 끝이다

Sign in with Apple

  • AuthenticationServices, Firebase 와 같은 패키지를 추가해준다. (SPM으로도 추가 가능)
  • 애플로그인 버튼 생성하기
  • 터치 이벤트 생성하기
  • ASAuthorizationControllerDelegate 추가하기
  • 로그인 인증 창 띄우기
  • 로그인 동작 코드 추가
    업로드중..
    keychain.set을 통해서 토큰을 관리해주면 끝!

전체 코드 정리

참고) baseviewController는 프로젝트 편의성을 위해서 만든거라 uiviewcontroller와 같음

class LoginViewController: BaseViewController, AuthUIDelegate,ASAuthorizationControllerDelegate {
	@objc private func handleAppleSignIn() {
        let appleIDProvider = ASAuthorizationAppleIDProvider()
        let request = appleIDProvider.createRequest()
        request.requestedScopes = [.fullName, .email]
        let authorizationController = ASAuthorizationController(authorizationRequests: [request])
        authorizationController.delegate = self
        authorizationController.presentationContextProvider = self
        authorizationController.performRequests()
    }
    func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
        if let appleIDCredential = authorization.credential as? ASAuthorizationAppleIDCredential {
            guard let appleIDToken = appleIDCredential.identityToken else {
                print("Unable to fetch identity token")
                return
            }
            guard let idTokenString = String(data: appleIDToken, encoding: .utf8) else {
                print("Unable to serialize token string from data: \(appleIDToken.debugDescription)")
                return
            }
            
            let credential = OAuthProvider.credential(withProviderID: "apple.com", idToken: idTokenString, rawNonce: nil)
            Auth.auth().signIn(with: credential) { (authResult, error) in
                if (error != nil) {
                    print(error?.localizedDescription)
                    return
                }
                
                print("User is signed in")
                print("UserToken\(idTokenString)")
                self.keychain.set(idTokenString, forKey: "idToken")
            }
        }
    }
    
    func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) {
        // Handle error.
        print("Sign in with Apple errored: \(error)")
    }
}
extension LoginViewController: ASAuthorizationControllerPresentationContextProviding {
    func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor {
        // Apple 로그인 인증 창 띄우기
        return self.view.window ?? UIWindow()
    }
}
profile
Flutter, Swift 모바일 개발자의 스타트업에서 살아남기

0개의 댓글