친구목록 API 호출 시 권한 문제

문의 시, 사용하시는 SDK 버전 정보와 디벨로퍼스 앱ID를 알려주세요.

Faq 목록 - 10. Android ( Faq 목록 입니다 ) 먼저 확인해주세요.


Android API 34, KAKAO SDK 2.16.0, AppId 911713

UserApiClient.instance.scopes 를 통해 권한을 가져오면 friends 스코프가 있는 걸로 나오는데
https://kapi.kakao.com/v1/api/talk/friends 를 사용해서 목록을 가져오려고 하면 -402로 스코프가 필요하다고 나오네요.
데이터가 꼬인 걸까요?

어떤 문제인지 확인해주시면 감사하겠습니다.

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        UserApiClient.instance.scopes { scopeInfo, error->
            if (error != null) {
                Logger.e("동의내역 확인 실패", error)
            } else if (scopeInfo != null) {
                Logger.d("동의 정보 확인 성공\n 현재 가지고 있는 동의 항목 $scopeInfo")
                if (scopeInfo.scopes?.find { it.id == "friends" } != null) {
                    fetchFriendsInfo(sharedViewModel.userInfo.value!!.accessToken)
                } else {
                    showDebugToast("친구 목록 가져오기 권한이 없습니다")
                    requestRequiredPermission()
                }
            }
        }
    }

    private fun requestRequiredPermission() {
        val scope = listOf("friends")
        UserApiClient.instance.loginWithNewScopes(requireActivity(), scope) { token, error ->
            if (error != null) {
                showDebugToast("사용자 동의 받기 실패")
            } else {
                Logger.d("newToken: ${token.toString()}")
            }
        }
    }

    private fun fetchFriendsInfo(token: String) {
        val client = OkHttpClient.Builder().build()
        val request = Request.Builder()
            .url("https://kapi.kakao.com/v1/api/talk/friends")
            .addHeader("Authorization", "Bearer $token")
            .get()
            .build()

        client.newCall(request).enqueue(object : Callback {
            override fun onFailure(call: Call, e: IOException) {
                Logger.d("friends >> $e")
            }

            override fun onResponse(call: Call, response: Response) {
                val data = response.peekBody(Long.MAX_VALUE).string()
                Logger.d("friends >> $data")
            }

        })
    }


현재 가지고 있는 동의 항목 ScopeInfo(id=*, scopes=[Scope(id=profile_nickname, displayName=닉네임, type=PRIVACY, using=true, delegated=null, agreed=true, revocable=false), Scope(id=profile_image, displayName=프로필 사진, type=PRIVACY, using=true, delegated=null, agreed=true, revocable=false), Scope(id=friends, displayName=카카오 서비스 내 친구목록(프로필사진, 닉네임, 즐겨찾기 포함), type=PRIVACY, using=true, delegated=null, agreed=false, revocable=null), Scope(id=account_email, displayName=카카오계정(이메일), type=PRIVACY, using=true, delegated=null, agreed=true, revocable=false), Scope(id=gender, displayName=성별, type=PRIVACY, using=true, delegated=null, agreed=true, revocable=true), Scope(id=age_range, displayName=연령대, type=PRIVACY, using=true, delegated=null, agreed=true, revocable=true), Scope(id=birthday, displayName=생일, type=PRIVACY, using=true, delegated=null, agreed=true, revocable=true), Scope(id=story_permalink, displayName=카카오스토리 프로필 URL, type=PRIVACY, using=true, delegated=null, agreed=true, revocable=true)])

2023-10-09 23:22:23.227  2284-3917  tag_debug  D  friends >> {"msg":"insufficient scopes.","code":-402,"api_type":"FRIENDS","required_scopes":["friends"],"allowed_scopes":["age_range","birthday","account_email","profile_image","gender","profile_nickname","story_permalink"]}

추가적으로 '동의하고 계속하기’를 눌러도 크롬창에서 아무런 반응이 없습니다.
이 문제와 혹시 관련이 있을까요? redirect url 관련하여 매니페스트에 등록한 부분도 누락된 게 없습니다

(1) 기재하신 '현재 가지고 있는 동의 항목’에 friends는 agreed=false 로 동의 안된 상태입니다.
(2) 에러 메시지에 required_scopes은 동의받지 못한 항목을 의미하고 allowed_scopes는 현재 동의상태를 의미합니다.
(3) 동의창에서 '동의하고 계속하기’를 눌러도 크롬창에서 아무런 반응이 없었다면 동의 안된 것입니다.
(4) (2)번증상은 동의창에서 개발하신 앱으로 돌아가지 못하는 것으로 매니페스트 설정이 잘못된 일반적인 증상입니다.

매니페스트 설정을 기재해주시면 추가로 내용 확인해드리겠습니다.

안녕하세요, 요청주신 매니페스트 코드 첨부드립니다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:name=".MyApplication"
        android:allowBackup="false"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.MyCartApp"
        tools:targetApi="31">
        <activity
            android:name=".presentation.SplashActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:exported="true"
            android:noHistory="true"
            android:launchMode="singleTask"
            android:theme="@style/Theme.MyCartApp">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".presentation.MainActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:exported="false"
            android:label="@string/app_name"
            android:launchMode="singleTask"
            android:theme="@style/Theme.MyCartApp">
        </activity>

        <activity
            android:name="com.kakao.sdk.auth.AuthCodeHandlerActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <!-- Redirect URI: "kakao${NATIVE_APP_KEY}://oauth" -->
                <data android:host="oauth"
                    android:scheme="kakao${KAKAO_NATIVE_APP_KEY}" />
            </intent-filter>
        </activity>
    </application>

</manifest>

개발하신 앱에 "Redirect URI: “kakao${NATIVE_APP_KEY}://oauth” 설정이 잘되었는지

웹페이지에서 아래와 같이 a link 클릭하셔서 개발하신 앱 실행되는지 확인해주세요.

<a href="kakao{앱키}://oauth">카카오앱키 설정된 앱 호출</a>

동의창은 브라우저 환경이니 기본 브라우저에서 위에 안내드린데로 a link로 호출해보시겠어요?

첨부드린 https://www.rapidtables.com/web/tools/html-link-code.html 에서 테스트 해도 같은 상황이었습니다.
여기서는 말씀주신 a link 방식으로 연결해주는데 혹시 다른 부분이 있으실까요?

웹브라우저에서 앱스킴 호출했는데 "앱으로 전환"이 안되었다면, 앱에 설정이 잘못된 상황 말고는 유추할 수 있는 상황이 없는데요.

https://www.rapidtables.com/web/tools/html-link-code.html 여기서 저도 동일하게 테스트 해보니 개발한 앱이 정상적으로 호출됩니다. (앱이 실행된 상태에서 브라우저 a link 터치 시, 앱으로 이동)

<a href="kakao{앱키}://oauth">카카오앱키 설정된 앱 호출</a>

아래 페이지 Android SDK Full Source & Samples 에서 예제 다운로드 받으셔서 앱키 설정 변경하시고 정상작동하는지 확인해보시겠어요?

https://developers.kakao.com/docs/latest/ko/android/download#latest

네 샘플 앱에서는 잘 동작하는 것 같습니다.
우선 현재 이슈는 해결이 됐구요.

원인은 manifest 내에 Manifest 변수로 참조하던 부분이었던 것 같습니다.
해당 부분을 네이티브 키로 하드코딩으로 넣어주니 잘 동작하네요.

다만, 이전에는 하드코딩으로 넣었을 때도 동작을 안해서 헤맸던 것이었는데 이 부분에 대해서는 정확한 이유를 잘 모르겠네요.
혹시라도 같은 증상이 다시 발생하면 문의드리겠습니다.

정성스러운 답변 감사합니다. 많이 도움됐어요.

1개의 좋아요