[ iOS ] 애플 로그인 (Sign in with Apple) 구현

WWDC 19에서 발표한 애플 로그인 (Apple Login)은 iOS 13 SDK 부터 사용이 가능합니다. 만약 구글이나 페이스북 로그인을 이용해 로그인 및 인증을 사용하게되면 애플로그인도 강제로 달아야 한다는 조항이 있답니다. 조금 억지스럽지만 애플의 가이드를 따르는게 좋겠죠. 그리고 페이스북 (Facebook) 이나 구글 로그인 인증에 비해서 사용법이 아주 간단하니 추가하는 편이 좋을 것 같습니다. 만약 iOS 12 이하 단말을 지원한다면 해당 단말에서는 애플로그인을 숨겨서 보여주면 됩니다. 인증서나 App ID에 대한 이해가 있다고 생각하고 글을 작성합니다.

 

 App ID 와 p8키 설정하기 

 

▼ 1. 애플 개발자 계정 (Apple Developer) 에 접근해서 Identifiers 탭을 선택하고 애플로그인에 필요한 앱 아이디를 선택하고 수정합니다. Sign in with Apple 항목에 체크를 눌러주면 됩니다.

Apple App ID 설정


 

▼ 2. 이번에는 Keys 항목에서 로그인에 필요한 p8 키를 수정해줍니다. 보통 푸시서비스에 사용하는 키입니다만 애플로그인에서도 사용됩니다. 이 역시 Sign in with Apple 항목을 체크해주고 Configure 버튼을 눌러서 상세 설정을 합니다. 참고로 이전에 받아놓은 키로도 정확히 동작하니 키를 다시 받아야 하는지 고민할 필요는 없습니다.

Apple p8 키 설정


 

 

▼ 3. Configure Key 페이지에서 위에서 애플아이디를 수정했던 앱 아이디를 선택해주고 저장버튼을 눌러 환경설정을 마칩니다.

키와 App ID 연동


 

 

 프로젝트 설정 

 

▼ 4. 이제 Xcode에서 설정을 해줍니다. 프로젝트의 타깃을 선택하고 Signing & Capabilities의 탭에서 + Capability 버튼을 눌러 Login 이라고 검색하면 Sign in with Apple 이라는 항목이 검색됩니다. 이떄 클릭하면 하단 Capbability 항목에 추가되며 자동으로 entitlement 파일이 생성됩니다.

Signing & Capabilities 설정


 

 

▼ 5. 만약 푸시서비스도 선택된 상태라면 해당 entitlements 파일에 Sign in with Apple 항목이 추가되어 있습니다.

entitlements 파일 확인


 

 

 뷰 컨트롤러 생성과 코드 입력 

 

▼ 6. 이제 설정은 모두 끝났으니 코드를 작성합니다. 간단한 뷰 컨트롤러이며 ASAuthorizationControllerDelegate를 프로토콜을 구현합니다. 두개의 메서드가 있으며 다음과 같은 기능을 합니다.

  • authorizationController:didCompleteWithAuthorization - 성공처리
  • authorizationController:didCompleteWithError  - 실패처리

LoginViewController


 

 

 

전체 코드


import UIKit
import AuthenticationServices

class ViewController: UIViewController {
    
    
    @IBOutlet weak var signInView: UIView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        addButton()
    }

    func addButton() {
        let button = ASAuthorizationAppleIDButton(authorizationButtonType: .signIn, authorizationButtonStyle: .black)
        button.addTarget(self, action: #selector(loginHandler), for: .touchUpInside)
        signInView.addSubview(button)
    }

    @objc func loginHandler() {
        let request = ASAuthorizationAppleIDProvider().createRequest()
        request.requestedScopes = [.fullName, .email]
        let controller = ASAuthorizationController(authorizationRequests: [request])
        controller.delegate = self
        controller.presentationContextProvider = self as? ASAuthorizationControllerPresentationContextProviding
        controller.performRequests()
    }
}

extension ViewController : ASAuthorizationControllerDelegate  {
    func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
        if let credential = authorization.credential as? ASAuthorizationAppleIDCredential {
            let user = credential.user
            print("👨‍🍳 \(user)")
            if let email = credential.email {
                print("✉️ \(email)")
            }
        }
    }
    
    func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) {
        print("error \(error)")
    }
}

 

▼ 7. 다음은 로그인 버튼을 눌렀을 떄 출력 결과입니다.

Log 출력 결과


 

애플로그인은 다음 2가지 정보를 제공합니다.

  • 사용자 이메일
  • 사용자 정보

사용자 이메일의 경우 사용자가 이메일 가리기 기능을 사용하면 실제 메일 주소가 아닌 apple에서 발급한 이메일을 반환합니다. 해당 이메일로 이메일을 발송하면 원래 사용자 이메일로 전송됩니다. 그런데 특이한 점은 저 로그인 이메일은 최초에 한번 발행하고 그후에는 반환하지 않습니다. 만약 초기화 하고 싶다면 아이폰에서 설정 > Apple ID > 암호 및 보안 > Apple ID를 사용하는 앱 에서 해당 정보를 삭제하고 다시 진입해서 로그인해야 합니다. 애플로그인은 웹, 앱을 가리지 않고 사용되니 많은 로그인 정보가 있을 수 있습니다. 그중에 해당 앱의 정보를 삭제하면 다시 이메일을 정보를 반환합니다. 이뜻은 최초에 로그인과 함께 회원가입 테이블에 해당 이메일을 저장해야한 다는 의미죠.

댓글

Designed by JB FACTORY