[Swift/iOS] 애플 로그인 후 반환 값 ASAuthorizationAppleIDCredential From 공식문서
애플 로그인(Apple Authentication Services)를 적용시킨 후 반환되는 값에 대해서 살펴보고자 합니다.
유저가 첫 로그인에 성공하면, 가입 후 애플 서버로부터 받은 유저 정보를 서비스하는 서버에 전달해야 합니다.
서비스에서도 일부 정보를 사용하고 저장해야하기 때문입니다.
(애플 서버가입 여부는 아이폰 기준, 설정 - Apple ID - 암호 및 보안 - Apple로 로그인 - Apple ID를 사용하는 앱에서 확인 가능)
서버 쪽에서는 이 전달받은 데이터를 다시 검증하는 것으로 알고 있습니다.
authorization.credential as? ASAuthorizationAppleIDCredential
첫 로그인 시 확인할 수 있는 값 중 identityToken과 authorizationCode를 서버로 전달해야 합니다.
다른 포스팅을 찾아보았는데 userIdentifier, fullname이나 email 정도만을 언급하고 마무리 짓는 경우가 많았습니다.
공식문서를 확인해서 ASAuthorizationAppleIDCredential 클래스에 있는 값들을 추가로 살펴보겠습니다.
func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
if let appleIDCredential = authorization.credential as? ASAuthorizationAppleIDCredential {
print("fullName, ", appleIDCredential.fullName)
print("email, ", appleIDCredential.email)
}
}
애플 로그인에서 로그인이 성공했을 때,
ASAuthorizationControllerDelegate의 didCompleteWithAuthorization 메서드에서 값들을 확인할 수 있습니다.
얻을 수 있는 값들을 확인해보겠습니다.
func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
if let appleIDCredential = authorization.credential as? ASAuthorizationAppleIDCredential {
print("// Identifying a User")
print("identityToken, ", appleIDCredential.identityToken)
print("authorizationCode, ", appleIDCredential.authorizationCode)
print("state, ", appleIDCredential.state)
print("user, ", appleIDCredential.user)
print("")
print("// Getting Contact Information")
print("authorizedScopes, ", appleIDCredential.authorizedScopes)
print("fullName, ", appleIDCredential.fullName)
print("email, ", appleIDCredential.email)
print("")
print("// Detecting User Characteristics")
print("realUserStatus, ", appleIDCredential.realUserStatus.rawValue)
}
}
애플 로그인 첫 성공 시 반환 값
애플 로그인에 처음 성공한다면 반환 값은 다음과 같습니다.
두 번째 이후로 로그인한다면 다음과 같습니다.
이제 하나하나 살펴보겠습니다.
identityToken
JSON Web Token으로서, 유저에 관한 정보를 안전하게 앱에 전달하기 위한 것.
이게 무슨 말일까싶지만, 간단하게 설명하면 서버에서 유저 정보를 검증할 때 필요한 토큰이라고 볼 수 있습니다.
인증할 때마다 다른 값이 반환됩니다.
authorizationCode
앱이 서버와 상호작용 하는 데 사용되는 토큰.
identityToken과 같이 서버로 보내준 후, 서버는 애플서버로 유효성 검사를 하게 됩니다.
짧은 시간만(short-lived) 유효합니다.
state
credential을 생성하는 요청에 앱이 제공하는 임의의 String 값.
인증 요청 시 생성되는 리퀘스트에 대한 상태정보를 포함하는 문자열이며, 인증 결과를 확인하고 상태 정보를 비교할 수 있습니다.
(근데 nil이 계속 반환되고 있습니다)
user
인증된 유저의 고유한 identifier 값, 변경되지 않습니다.
authorizedScopes
앱이 접근할 수 있는 사용자가 허락한 연락처 정보.(빈값이 반환되고 있습니다.)
fullName
유저의 이름(Apple ID에서 제공되는, 또는 Sign in with Apple UI에서 유저가 정한).
처음 로그인 시에만 확인할 수 있습니다.
이후에는 빈값이 반환됩니다.
유저의 이메일, 처음 로그인할 때 실제 이메일 주소 혹은 애플이 임의로 생성한 가상 이메일 주소.
처음 로그인 시에만 확인할 수 있습니다.
이후에는 nil이 반환됩니다.
realUserStatus
Int값이 반환되는데,
2은 likelyReal 유저가 진짜 사람,
1은 unknown 시스템이 유저가 진짜 사람인지 아닌지 결정하지 못함,
0은 unsupported 사용자의 실재여부를 확인할 수 없음 입니다.
(두 번째에는 1이 반환되었습니다.)
이후의 과정
처음 로그인했을 때에만 이름과 이메일이 전달되니 이것을 클라이언트 앱에 저장합니다.
id토큰과 auth코드를 서버로 보낸 후 리턴되는 access토큰과 refresh토큰을 클라이언트 앱에 저장한다.
(이 부분은 서비스마다 다를 수 있습니다. 자세한 부분은 서버 개발자와 이야기 해야합니다.)
user값은 ASAuthorizationAppleIDProvider의 getCredentialState 메서드의 인자로 사용할 수 있으므로, 역시 저장합니다.
앱에서 애플 로그인 상태를 확인할 수 있는 메서드입니다.
예를 들면 사용자가 Apple ID 설정에서 Apple ID 사용 중단을 한다면, 앱에서 새로 로그인할 수 있도록 처리해 주기 위함입니다.
참조
https://developer.apple.com/documentation/authenticationservices/asauthorizationappleidcredential
https://labs.brandi.co.kr//2021/04/09/chosh.html
https://hyesunzzang.tistory.com/206