안녕하세요!
ios로 카카오톡 로그인을 구현하고 있습니다.
구현하려고 하는 로직은 아래와 같습니다.
카카오톡으로 로그인 후 받은 토큰 값으로 서비스에 가입된 회원인지 아닌지를 받아옴
받은 결과 값에 따라서 함수 호출
만약 서비스에 가입된 회원이 아니라면 카카오 계정으로 로그인을 시도 후 받은 토큰 값으로 서비스에 가입된 회원인지 아닌지를 받아옴
만약 서비스에 가입된 회원이 아니라면 서비스 회원가입화면으로 전환
현재 상황은 1번에서는 토큰 값을 받아오지만 3번에서는 토큰을 nil로 받아와서 로그인을 실패하고 있습니다.
로그인 실패시 나타나는 오류로그는 아래와 같습니다.
혹시 원인을 알 수 있을까요??
[2022-11-09 21:01:22287 [][AuthController.swift 258:33] → An error occurred on executing authentication session.
reason: related decl ‘e’ for ASWebAuthenticationSessionErrorCode(_nsError: Error Domain=com.apple.AuthenticationServices.WebAuthenticationSession Code=3 “The UIWindowScene for the returned window was not in the foreground active state.” UserInfo={NSDebugDescription=The UIWindowScene for the returned window was not in the foreground active state.})]
다른이야기지만,
보통은 카카오톡 설치 여부를 먼저 판단하여 웹 로그인 또는 톡 로그인 중 하나만 사용하도록 구현 하는데요
톡 로그인이 미가입 상태인경우 웹뷰로 다시 로그인 시도하는 이유가 어떻게 되실까요?
이미 톡 로그인상태이고 이 상황에서는 접근코드를 갖고 있기에 웹 로그인으로 전환하실 필요가 없어 보이십니다.
카카오계정이 아니라는 말씀이 무슨 뜻인지 알 수 있을까요?
카카오 계정이 해당 서비스에 가입되지 않은 상태를 말씀하시는 것이라면 토큰을 서버에 보내면 서버에서 카카오 서버에 보내서 해당 유저의 정보를 가져옵니다. 만약 서버에서 해당 토큰을 보냈을 때 카카오 서버에서 올바른 값을 보내주지 않는다면 (정보에 nil이 있는 경우) 해당 카카오계정은 서비스에 가입되지 않는 것으로 판단하여 서버에서 response값을 줍니다. (서버담당자가 아니기 때문에 정확한 로직은 말씀드리기 어려우나 추후 해당 답변에 질문이 있으시면 서버 담당자분께 질의드리겠습니다!)
네 맞습니다.
우선 카카오 로그인 버튼을 누르면 카카오톡 로그인을 우선으로 합니다.
해당 카카오 계정이 서비스에 가입되지 않았다는 서버의 API 리스폰스를 받으면 함수가 실행됩니다.
해당 함수에서는 앱으로 시도했고 로그인에 실패했다는 조건문에 걸려 웹로그인으로 다시 시도합니다. 또한 여기서 다시 로그인을 실패한다면 웹으로 시도했고 로그인에 실패했다는 조건문에 걸려 해당 서비스 회원가입 화면으로 전환됩니다. 결론은 가입되지 않은 사실을 체크하고 곧바로 웹 로그인을 호출하고 있습니다.
“카카오계정이 아닌 경우는 어떻게 판단하실까요” 라는 문의는 위 내용때문에 드렸었는데요
결국 문의 드리고 싶었던 내용은 서비스에 가입되지 않았다는것을 어떤기준으로 판단하는가 였습니다.
앱 616183의 동의 항목 설정을 보면, 카카오계정(이메일) 만 선택동의로 설정되어 있습니다.
때문에, 서비스 가입여부를 사용자의 이메일로 판단하시는 것 같습니다.
만약 그렇다면, 지금 논의 되고 있는 이슈보다 먼저, 이렇게 개발 되시면 안됩니다.
이메일은 사용자가 동의하지 않을수 있고 동의 하였다 하더라도 언제든지 변경할수 있기에 이를 회원가입 여부와 회원 식별용도로 사용 하셔서는 안됩니다.
이메일이 필수로 필요하신 서비스라면, 해당 동의항목을 필수로 설정하시고 카카오 계정으로 정보 수집 후 제공 옵션을 켜시면(현재 켜져있음) 사용자가 카카오 로그인시 이메일 정보를 반드시 받을수 있습니다.
그리고, 회원식별은 사용자 정보조회 시 반환되는 회원번호(앱유저아이디)를 사용하여야 합니다.