[iOS] - AppleLogin + FirebaseAuth 진행 시 발생한 사용자 이름 nil 이슈

sun02·2023년 8월 4일
0

iOS

목록 보기
25/27
post-thumbnail

AppleLogin과 Firebase Authentication 연동 시 발생한 이슈 해결 과정을 작성합니다.

📍 Apple Login 구현을 위해 필요한 기초 세팅은 다루고 있지 않습니다.


목차

  1. AppleLogin + Firebase 연동하기
  2. 문제 상황
  3. 해결 방법
  4. 그 외
  5. 느낀점

1. Apple Login + Firebase 연동하기

Auth.auth().signIn(with: credential) 를 사용합니다.

Apple Login은 Firebase 로그인을 지원하기 때문에 credential을 사용한 signIn을 진행할 수 있습니다.


- func authorizationController(controller: ASAuthorizationController,..)

Apple Login 성공 시 호출되는 메서드로 사용자가 제공에 동의한 정보를 확인할 수 있는 메서드

따라서 위 메서드에서 credential을 생성하여 firebase Auth SingIn을 진행하면 됩니다

- 이렇게

해당 부분 전체 코드가 궁금하다면
Firebase Github 에서 확인할 수 있습니다.


2. 사용자 이름이 nil로 전달되는 이슈

제가 진행하던 프로젝트에서는 Cloud Firestore에서 User 데이터를 관리하고 있었습니다.
따라서, SignIn 이후 전달받는 사용자 데이터를 Cloud Firestore에 저장해주고 있었는데 Apple Login로 등록한 사용자의 이름만 nil로 나타나고 있었습니다.

먼저 제가 작성한 코드는 아래와 같습니다.

- signIn(with: credential)

다음과 같이 signIn(with: credential)을 진행하면 해당 메서드는 AuthDataResult를 전달합니다.


- AuthDataResult

그리고 AuthDataResult 는

  • User
  • AdditionalUserInfo
  • Credential

을 포함하고 있습니다.

- User

SignIn 한 유저

User는 UseInfo 프로토콜을 따르고 있고

UserInfo는

  • ProviderID
  • uid
  • displayName
  • photoURL
  • email
  • phoneNumber

를 포함하고 있습니다.


따라서 저는 signIn(with: credential) 이후 전달 받은 AuthDataResult에서
User의 displayName, email, photoURL을 사용하여 Firebase의 Cloud Firestore에 User 정보를 저장했습니다.

- 요렇게

하하.. 그런데 말입니다


저는 아무런 가공을 하지 않았는데, AppleLogin 에서만, 이렇게 name 이 nil로 저장되는 것입니다.....


- 원인

출처 : Firebase 문서

  • Apple은 계정으로 처음 로그인할 때만 사용자 정보를 앱에 공유한다
  • Apple은 Firebase에서 사용자의 이름을 제공하지 않는다.

따라서, credential로 SignIn 하더라도 Apple로 로그인한 경우에는 User의 displayName이 nil 로 나타나는 것이였습니다.


3. 해결 방법

Apple Login 성공 시 호출되는 메서드에서 credential 뿐만 아니라 사용자의 displayName도 함께 전달

- func authorizationController

다만 위에서 언급했다시피 Apple 로그인은 첫 번째 로그인에만 이름을 제공하고 이후에는 이름을 전달하지 않기 때문에 nil인 경우도 반드시 다뤄줘야합니다.


- signIn(with: credential)

displayName이 nil 인 경우에는 user.name을 전달받은 name으로 설정해줍니다.

이렇게하면 해결 완 ~~ 🌟


4. 그 외

Apple Login 기록 지우는 방법

애플 로그인은 첫 로그인 시에만 name을 전달하기 때문에 테스트할 때 로그인 기록을 지워야합니다
그러나 저는 어떻게 지우는지 몰랐었기에.. 😹


- 설정 > 사용자 계정(Apple ID) > password & security

여기 sign in with Apple 을 들어가면 Apple Login을 진행한 앱 목록들을 모두 볼 수 있습니다

Apple login 한 기록을 지우고 싶은 앱을 누르고

Stop using Apple ID 를 하면 해당 앱에서 Apple Id로 로그인한 기록이 지워집니다.


5. 느낀점

1. 지원은 하는데 정보는 안준다?

Firebase 지원하기로 했으면서 이름을 제공하지 않는건 무슨 경우입니까.. 흑흑

2. 암호화된 이메일 👍🏻

그럼에도 애플을 욕할 수 없는건 이메일을 반드시 제공해야하는 상황에서 DB 상에 암호화된 이메일 주소를 남길 수 있게 해주고,
암호화된 이메일 주소로 메일을 보내도 실제 이메일로 전송된다는 디테일..

3. Firebase 문서 좋은데 싫다

문서가 방대해서 Firebase를 처음 접했을 땐 내가 원하는 정보를 어디서 찾을 수 있는지 찾기가 어려웠다.
근데 계속 찾아보면서 익숙해지니 Firebase 만큼 친절하게 문서를 제공하는 곳도 없다 싶음..!

4. 개발 들어가기 전에 공식문서 확인하는 습관을 들여야겠다

중요한걸 알면서도 급해서 대충 훑고 개발에 막바로 들어가버리곤 하는데.. 중요한 큰 이슈들은 사실 공식문서에 다 있어서 확인을 안하면 결국 또 그만큼 시간을 날리게 된다. 이번 애플로그인 이슈도 공식문서에 기재되어있었다ㅠㅠ

5. kakao는 Firebase 지원 안하려나요

네이버나 카카오같은 경우 signInWithEmail 로 진행했는데 password 설정이라던가 여러모로 모호하다고 느껴지는 부분이 있었다.
또한, 카카오 같은 경우 비즈니스 계정이 아니면 email을 제공하지 않아 애를 좀 먹었기 때문에..

6. 보안 정책이 회사마다 참 다양하다

애플은 이메일은 주는데 이름을 안주고
카카오는 이름은 주는데 이메일은 안주고
보편적인 규정이 없고 각자 회사 내 방침을 따르는 걸까?

1개의 댓글

comment-user-thumbnail
2023년 8월 4일

유익한 글이었습니다.

답글 달기