Swift 로그인 선택 동의 관련하여 질문드립니다

안녕하세요 :slight_smile:

ios는 RxKakaoSDK
을 사용하고 있습니다.

카카오 로그인을 테스트 하고 있는 데요.
저희 아임인 앱 설정이 이메일은 선택 동의로 되어있는 데요.
앱으로 로그인 시도를 하였을 때, 선택 동의 하는 페이지가 안나옵니다.

웹에서는 나왔던 것으로 기억하고 있는 데, ios에서는 안보이는 데 해결 방법이 있을까요?

추가적으로 이메일을 필수로 받는다면, 비즈앱으로 전환하였을 때 현재 서비스 중인 앱에서 달라지는 것이 있는지도 문의드립니다.

1개의 좋아요

안녕하세요.
사용하시는 sdk버전과 app id 부탁드립니다.

1개의 좋아요

안녕하세요.

RxKakaoSDK를 사용중이며,
app id 는 1541249174 입니다

1개의 좋아요

해당앱키가 없다고 나옵니다.

디벨로퍼사이트의
내 애플리케이션>앱 설정>요약정보

에서 확인 후 다시 올려주세요

1개의 좋아요

스토어 아이디와 착각했네요.
id는 117315 입니다.

1개의 좋아요

아임인 이라는 서비스 맞으실까요?

해당 앱아이디로는 저희쪽 로그에 iOS SDK를 사용한 기록이 없습니다.

어떤 메소드를 호출했을때 어떤 response가 오는지 구체적으로 설명부탁드립니다.
(디버깅창의 로그를 부탁드립니다.)

1개의 좋아요

로그 기록이 없나요?.. 방금도 사용해서 로그인을 했는 데 왜 없을지 궁금합니다 ㅠ

로그인 할 때는 다음 메소드를 호출 하였습니다.

if AuthApi.isKakaoTalkLoginAvailable() {
        AuthApi
            .shared
            .rx
            .loginWithKakaoTalk()
            .subscribe(
            onNext: { [self] (oauthToken) in
                print("카카오 앱 로그인 success")
                print(oauthToken)
                kakaoUserData()
                kakaoGetUserToken()
                _ = oauthToken
            },
            onError: { error in
                print(error)
            }
        )
            .disposed(by: disposeBag)
    } else {
        AuthApi
            .shared
            .rx
            .loginWithKakaoAccount()
            .subscribe(onNext: { [self] (oauthToken) in
            print("웹으로 로그인 success.")
            kakaoUserData()
            kakaoGetUserToken()
            print(oauthToken)
        }, onError: { error in
            print(error)
        })
            .disposed(by: disposeBag)
    }

해당 oauthToken 로그 파일입니다.
OAuthToken(tokenType: "bearer", accessToken: "u2B0xz6crmkYGINAzhU-sg_mxo87IAZVUWwxeQo9dRoAAAF3QlvfKw", expiresIn: 43199.0, expiredAt: 2021-01-27 17:40:52 +0000, refreshToken: "6NvBAZbbiklxyJ9i2_SOvi6xyooF1GsJ1rpFwwo9dRoAAAF3QlvfKg", refreshTokenExpiresIn: 5183999.0, refreshTokenExpiredAt: 2021-03-28 05:40:52 +0000, scope: Optional("profile"), scopes: Optional(["profile"]))

그 다음

UserApi.shared.rx.me().subscribe(onSuccess: { user in
            print("user Email? \(user.kakaoAccount?.email)")

        if let email = user.kakaoAccount?.email {
            print("email \(email)")
        }
    }, onError: { error in
        print(error)
    })
        .disposed(by: disposeBag)

me() 호출을 하였구요. response는 이렇게 나왔습니다. 닉네임과 사진은 경로 수정했습니다~

User(id: 1570534943, properties: Optional(["nickname": "문의자", "thumbnail_image": "https://k.kakaocdn.net/img_110x110.jpg", "profile_image": "https://k.kakaocdn.net/mg_640x640.jpg"]), kakaoAccount: Optional(KakaoSDKUser.Account(profileNeedsAgreement: Optional(false), profile: Optional(KakaoSDKUser.Profile(nickname: "문의자", profileImageUrl: Optional(https://k.kakaocdn.net/img_640x640.jpg), thumbnailImageUrl: Optional(https://k.kakaocdn.net/mg_110x110.jpg))), emailNeedsAgreement: Optional(true), isEmailValid: nil, isEmailVerified: nil, email: nil, ageRangeNeedsAgreement: nil, ageRange: nil, birthyearNeedsAgreement: nil, birthyear: nil, birthdayNeedsAgreement: nil, birthday: nil, birthdayType: nil, genderNeedsAgreement: nil, gender: nil, phoneNumberNeedsAgreement: nil, phoneNumber: nil, ciNeedsAgreement: nil, ci: nil, ciAuthenticatedAt: nil, legalNameNeedsAgreement: nil, legalName: nil, legalBirthDateNeedsAgreement: nil, legalBirthDate: nil, legalGenderNeedsAgreement: nil, legalGender: nil)), groupUserToken: nil, connectedAt: Optional(2020-12-22 07:28:19 +0000), synchedAt: nil)

제 아이디로 로그인한 것이고, 이메일 설정되어있습니다.
생일도 지정되어있구요.

확인 부탁드립니다!

1개의 좋아요

확인중입니다. 잠시만 기다려주세요.

1개의 좋아요

아 로그 확인했습니다.
정상적으로 me에 emailNeedsAgreement = true로 내려가고 있네요.

sdk와 같이 제공되는 샘플앱의 “me() incremental authorization required” 항목의 코드를 참조하시면 될거같습니다.

UserApi.shared.rx.me()
        .map({ (user) -> User in
            var scopes = [String]()

            //여기서 추가동의가 필요한 항목만 사용하심 됩니다.
            if (user.kakaoAccount?.emailNeedsAgreement == true) { scopes.append("account_email") }
            //if (user.kakaoAccount?.birthdayNeedsAgreement == true) { scopes.append("birthday") }
            //if (user.kakaoAccount?.birthyearNeedsAgreement == true) { scopes.append("birthyear") }
            //if (user.kakaoAccount?.ciNeedsAgreement == true) { scopes.append("account_ci") }
            //if (user.kakaoAccount?.legalNameNeedsAgreement == true) { scopes.append("legal_name") }
            //if (user.kakaoAccount?.legalBirthDateNeedsAgreement == true) { scopes.append("legal_birth_date") }
            //if (user.kakaoAccount?.legalGenderNeedsAgreement == true) { scopes.append("legal_gender") }                
            //if (user.kakaoAccount?.phoneNumberNeedsAgreement == true) { scopes.append("phone_number") }
            //if (user.kakaoAccount?.profileNeedsAgreement == true) { scopes.append("profile") }
            //if (user.kakaoAccount?.ageRangeNeedsAgreement == true) { scopes.append("age_range") }
            
            if (scopes.count > 0) {
                throw SdkError(scopes:scopes)
            }
            else {
                return user
            }
        })
        .retryWhen(Auth.shared.rx.incrementalAuthorizationRequired())
        .subscribe(onSuccess:{ ( user ) in
            self.success()
            
            //do something
            _ = user
            
        }, onError: {error in
            self.errorHandler(error: error)
        })
        .disposed(by: self.disposeBag)
1개의 좋아요

확인감사드립니다.

throw SdkError(scopes:scopes)

이부분은 어떻게 처리해야될 지 알 수 있을까요?

1개의 좋아요

그대로 두셔야 아래

이 동작합니다.

즉,
추가동의 받을게 없으면 user를 리턴하고 끝나게 되고
추가동의를 해야하면 일부러 에러를 일으켜서 동의를 받게됩니다

1개의 좋아요

제가 질문을 잘못드렸네요.!

제 질문은 SdkError 를 찾지 못 하는 데, 어떻게 사용해야할지에 대한 질문이었습니다.

import KakaoSDKCommon

KakaoSDKCommon을 import해줘야 SdkError을 제대로 찾아 사용할 수 있군요.

import 해준 후 위 로직에서 self.success()self.errorHandler(error:)를 제외하고 사용하였는 데요.

2021-01-27 16:39:09.822662+0900 Iminfintech[644:15848] [AuthenticationSession] Error: The provided scheme is not valid. A scheme must not include any special characters, such as ":" or "/"
2021-01-27 04:39:09825 [‼️][AuthController+Rx.swift 155:37] -> 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.})
ClientFailed(reason: KakaoSDKCommon.ClientFailureReason.Unknown, errorMessage: Optional("An error occurred on executing authentication session."))

다음과 같은 에러 로그가 뜹니다.

1개의 좋아요

똑같은 요청이 같은 시간대에 두번씩 오고 있는데요. 개발자님 코드 확인이 필요할듯합니다.

샘플앱 참고하시길 바랍니다.

1개의 좋아요

아 죄송합니다. 두번씩 찍히는것은 저희로그상 일시적인 문제 인듯해요.

해당 에러는 14.x에서 발생하고 있는데 sdk 동작과는 상관없습니다. (에러는 확인중에 있습니다. )
서버 로그상 정상적으로 응답이 나간것으로 확인됩니다.

1개의 좋아요

정상적으로 응답이 나간 것으로 확인하셨다는 것은 response가 정상적으로 나갔다라는 말씀이신건가요?

UserApi.shared.rx.me()
                .map({ (user) -> User in
                    var scopes = [String]()

                    //여기서 추가동의가 필요한 항목만 사용하심 됩니다.
                    if (user.kakaoAccount?.emailNeedsAgreement == true) { scopes.append("account_email") }
                    //if (user.kakaoAccount?.birthdayNeedsAgreement == true) { scopes.append("birthday") }
                    //if (user.kakaoAccount?.birthyearNeedsAgreement == true) { scopes.append("birthyear") }
                    //if (user.kakaoAccount?.ciNeedsAgreement == true) { scopes.append("account_ci") }
                    //if (user.kakaoAccount?.legalNameNeedsAgreement == true) { scopes.append("legal_name") }
                    //if (user.kakaoAccount?.legalBirthDateNeedsAgreement == true) { scopes.append("legal_birth_date") }
                    //if (user.kakaoAccount?.legalGenderNeedsAgreement == true) { scopes.append("legal_gender") }
                    //if (user.kakaoAccount?.phoneNumberNeedsAgreement == true) { scopes.append("phone_number") }
                    //if (user.kakaoAccount?.profileNeedsAgreement == true) { scopes.append("profile") }
                    //if (user.kakaoAccount?.ageRangeNeedsAgreement == true) { scopes.append("age_range") }
                    
                    if (scopes.count > 0) {
                        throw SdkError(scopes:scopes)
                    }
                    else {
                        return user
                    }
                })
                .retryWhen(Auth.shared.rx.incrementalAuthorizationRequired())
                .subscribe(onSuccess:{ ( user ) in
//                    self.success()
                    print("#@#@#@#@# \(user)")
                    //do something
                    _ = user
                    
                }, onError: {error in
//                    self.errorHandler(error: error)
                    print(error)
                })
                .disposed(by: self.disposeBag)

해당 코드에서 onSuccess 에 들어오지않고 있습니다.

1개의 좋아요

그럴리가요? 다시한번 확인 부탁드립니다.
샘플에서는 재현이 안됩니다. (정상적으로 동작합니다)

1개의 좋아요

그리고, 혹시 디버깅하시느라 브레이크포인트를 걸고 작업하시는지요?
서버로그를 보면 해당 작업을 수행할때는 여러개의 api 콜이 순서대로 발생하는데
그 순서가 정상적으로 보이는것이 몇개 없습니다.

브레이크 다 빼고 테스트 해보시고 디버그로그나 호출시간 알려주시면
문제 파악하는데 도움이 될거같아요

1개의 좋아요

혹시 진행사항 있나요? 진행사항 알려주세요.