[ iOS ] 애플 로그인 (Sign in with Apple) 구현
- Coding/스위프트 iOS
- 2021. 5. 9. 18:46
WWDC 19에서 발표한 애플 로그인 (Apple Login)은 iOS 13 SDK 부터 사용이 가능합니다. 만약 구글이나 페이스북 로그인을 이용해 로그인 및 인증을 사용하게되면 애플로그인도 강제로 달아야 한다는 조항이 있답니다. 조금 억지스럽지만 애플의 가이드를 따르는게 좋겠죠. 그리고 페이스북 (Facebook) 이나 구글 로그인 인증에 비해서 사용법이 아주 간단하니 추가하는 편이 좋을 것 같습니다. 만약 iOS 12 이하 단말을 지원한다면 해당 단말에서는 애플로그인을 숨겨서 보여주면 됩니다. 인증서나 App ID에 대한 이해가 있다고 생각하고 글을 작성합니다.
App ID 와 p8키 설정하기
▼ 1. 애플 개발자 계정 (Apple Developer) 에 접근해서 Identifiers 탭을 선택하고 애플로그인에 필요한 앱 아이디를 선택하고 수정합니다. Sign in with Apple 항목에 체크를 눌러주면 됩니다.
▼ 2. 이번에는 Keys 항목에서 로그인에 필요한 p8 키를 수정해줍니다. 보통 푸시서비스에 사용하는 키입니다만 애플로그인에서도 사용됩니다. 이 역시 Sign in with Apple 항목을 체크해주고 Configure 버튼을 눌러서 상세 설정을 합니다. 참고로 이전에 받아놓은 키로도 정확히 동작하니 키를 다시 받아야 하는지 고민할 필요는 없습니다.
▼ 3. Configure Key 페이지에서 위에서 애플아이디를 수정했던 앱 아이디를 선택해주고 저장버튼을 눌러 환경설정을 마칩니다.
프로젝트 설정
▼ 4. 이제 Xcode에서 설정을 해줍니다. 프로젝트의 타깃을 선택하고 Signing & Capabilities의 탭에서 + Capability 버튼을 눌러 Login 이라고 검색하면 Sign in with Apple 이라는 항목이 검색됩니다. 이떄 클릭하면 하단 Capbability 항목에 추가되며 자동으로 entitlement 파일이 생성됩니다.
▼ 5. 만약 푸시서비스도 선택된 상태라면 해당 entitlements 파일에 Sign in with Apple 항목이 추가되어 있습니다.
뷰 컨트롤러 생성과 코드 입력
▼ 6. 이제 설정은 모두 끝났으니 코드를 작성합니다. 간단한 뷰 컨트롤러이며 ASAuthorizationControllerDelegate를 프로토콜을 구현합니다. 두개의 메서드가 있으며 다음과 같은 기능을 합니다.
- authorizationController:didCompleteWithAuthorization - 성공처리
- authorizationController:didCompleteWithError - 실패처리
전체 코드
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. 다음은 로그인 버튼을 눌렀을 떄 출력 결과입니다.
애플로그인은 다음 2가지 정보를 제공합니다.
- 사용자 이메일
- 사용자 정보
사용자 이메일의 경우 사용자가 이메일 가리기 기능을 사용하면 실제 메일 주소가 아닌 apple에서 발급한 이메일을 반환합니다. 해당 이메일로 이메일을 발송하면 원래 사용자 이메일로 전송됩니다. 그런데 특이한 점은 저 로그인 이메일은 최초에 한번 발행하고 그후에는 반환하지 않습니다. 만약 초기화 하고 싶다면 아이폰에서 설정 > Apple ID > 암호 및 보안 > Apple ID를 사용하는 앱 에서 해당 정보를 삭제하고 다시 진입해서 로그인해야 합니다. 애플로그인은 웹, 앱을 가리지 않고 사용되니 많은 로그인 정보가 있을 수 있습니다. 그중에 해당 앱의 정보를 삭제하면 다시 이메일을 정보를 반환합니다. 이뜻은 최초에 로그인과 함께 회원가입 테이블에 해당 이메일을 저장해야한 다는 의미죠.
'Coding > 스위프트 iOS' 카테고리의 다른 글
애플 법인 개발자 등록 절차 및 보증인 추가 방법 (0) | 2021.05.14 |
---|---|
애플 개발자 D-U-N-S 번호(던스) 발급 및 업데이트 (0) | 2021.05.11 |
[ 아이폰 개발 ] iOS 13 앱 다크모드 무시하기 설정 (0) | 2021.04.17 |
[ iOS ] 앱 스토어 개인, 회사, 엔터프라이즈 차이점 (0) | 2021.04.15 |
[ iOS ] 로컬 PUSH 와 APNS 푸시 차이점 완벽 정리 (0) | 2021.03.28 |