이전 글에서는 로그인 버튼을 단순하게 구현하는것만 해봤구요
이제는 데이터를 만져볼게요
// 로그인 성공시
func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
switch authorization.credential {
case let appleIDCredential as ASAuthorizationAppleIDCredential:
// Create an account in your system.
let userIdentifier = appleIDCredential.user
let fullName = appleIDCredential.fullName
let email = appleIDCredential.email
if let authorizationCode = appleIDCredential.authorizationCode,
let identityToken = appleIDCredential.identityToken,
let authString = String(data: authorizationCode, encoding: .utf8),
let tokenString = String(data: identityToken, encoding: .utf8) {
print("authorizationCode: \(authorizationCode)")
print("identityToken: \(identityToken)")
print("authString: \(authString)")
print("tokenString: \(tokenString)")
}
print("useridentifier: \(userIdentifier)")
print("fullName: \(fullName)")
print("email: \(email)")
case let passwordCredential as ASPasswordCredential:
// Sign in using an existing iCloud Keychain credential.
let username = passwordCredential.user
let password = passwordCredential.password
print("username: \(username)")
print("password: \(password)")
default:
break
}
}
// 로그인 실패시
func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) {
print("--login err")
}
FaceID, 비밀번호 인증은 appleIDCredential 여기에 해당하고
iCloud의 비밀번호를 연동할때 passwordCredential에 해당하나봐요
테스트를 하면서 출력된 적이 없었어요... 언제나오는걸까요..
버튼을 클릭하면 위와같이
창이 뜨구요
로그인이 성공적이면 값을 받아올 수 있어요
받아올 수 있는 값에는
user - 유저고유 식별자
fullName - 유저이름
email - 유저이메일
authorizationCode - 인증코드..?
identityToken - 유저의 토큰
을 받아올 수 있어요
나중에 토큰 서드파티로 유효성검사를 하기위해서는 이값이 중요해요!
로그인시
hide를 선택하면 임의의 이메일을 받고
share을 선택하면 애플아이디의 이메일을 받아요
처음에는 잘됬는데
또 해보려니까 email값이 자꾸 nil이 나오더라구요...?
이유를 찾아봤는데
이미 가입이 됬기때문에 email값이 nil이 나오는거같아요
앱의 애플아이디연동을 삭제하고 다시 로그인하면 값이 잘나와요
애플아이디 연동을 어디서 끊나요??
설정 -> 계정 -> 암호 -> 애플아이디 사용앱 -> 해당앱 -> 아이디 사용 중단
에서 언제든지 중단할 수 있어요
앱을 로그인할 때 내가 이미 로그인 한적 있는건지 아닌지 알 수 있게 해줘야겠죠?
앱을 사용하다가 도중에 애플아이디를 해지 할 수도 있고 말이죠..!
AppDelegate에서 처리를 하라고 나와있네요
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
let appleIDProvider = ASAuthorizationAppleIDProvider()
appleIDProvider.getCredentialState(forUserID: "00000.abcabcabcabc.0000") { (credentialState, error) in
switch credentialState {
case .authorized:
print("authorized")
// The Apple ID credential is valid.
case .revoked:
print("revoked")
case .notFound:
// The Apple ID credential is either revoked or was not found, so show the sign-in UI.
print("notFound")
DispatchQueue.main.async {
// self.window?.rootViewController?.showLoginViewController()
}
default:
break
}
}
return true
}
authorized - 이미 증명이 된경우
revoked - 증명을 취소 했을 때
notFound - 증명이 존재하지 않을경우
각 상황에 따라서 앱의 시작화면을 설정해주면 될 것같아요
서버와 연동해서 애플로그인을 만들어야해요 이젠!!
원리를 간단하게 설명하자면
클라이언트에서 identityToken를 서버로 보내주면
서버에서 이 토큰을가지고
공개키를 이용해서 토큰을 복호화해서
developer.apple.com/documentation/sign_in_with_apple/generate_and_validate_tokens 를 참고해서
애플에게 https://appleid.apple.com/auth/token 로유효성검사를 요청하고
결과값을 이용해서 처리하는 식이에요
'iyOmSd > Title: Swift' 카테고리의 다른 글
[Swift] - TabBar 애니메이션: CollectionView를 이용한 페이징 (2) | 2020.04.29 |
---|---|
[Swift] - 화면전환 애니메이션 커스텀: UIViewControllerAnimatedTransitioning (4) | 2020.04.25 |
[Swift] - Apple Login (1/2) (0) | 2020.04.14 |
[Swift] - MultiPart통신 (멀티파트 이미지업로드) (2) | 2020.04.11 |
[Swift] XML 파싱 (0) | 2020.04.03 |