iyOmSd/Title: Swift

[Swift] - Apple Login (2/2)

냄수 2020. 4. 14. 19:19
반응형

이전 글에서는 로그인 버튼을 단순하게 구현하는것만 해봤구요

 

이제는 데이터를 만져볼게요

 

    // 로그인 성공시
    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를 서버로 보내주면

 

서버에서 이 토큰을가지고

 

appleid.apple.com/auth/keys

 

공개키를 이용해서 토큰을 복호화해서 

developer.apple.com/documentation/sign_in_with_apple/generate_and_validate_tokens 를 참고해서 

 

애플에게 https://appleid.apple.com/auth/token 로유효성검사를 요청하고

 

결과값을 이용해서 처리하는 식이에요

 

반응형