Id Token 가져오는 방법

com.kakao.sdk:v2-user:2.19.0
디벨로퍼 앱 ID : ID 1011774

안녕하세요?

Kakao login 을 사용하여 idToken 를 얻은후 backend server 에 API 호출시 해당 idToken를 보내서 Key 가 유효한지 검증하도록 구성하였습니다

사용 언어는 Kotlin 입니다

UserApiClient.instance.loginWithKakaoTalk(context) 을 사용하여
token 을 얻은후 token.idToken 을 얻을수 있습니다

그이후 App 실행시

if (AuthApiClient.instance.hasToken()) {
                            UserApiClient.instance.accessTokenInfo { accessTokenInfo, error ->

                             }
}

로 Token 유효성을 Check 하여 Token이 유효한 경우

val oauthToken = TokenManagerProvider.instance.manager.getToken()

이렇게 oautjToken 을 받아와 oauthToken?.idToken 를 확인해 보면 null 로 표시 됩니다

기존에 받아 놓은 idToken 을 그대로 사용하면
Backend server 에서 https://kauth.kakao.com/oauth/tokeninfo 로 검증 했을때 기간이 만료 된 것으로 나옵니다

idToken 을 가져오는 방법이 잘못 된 것일까요 ?

감사합니다

안녕하세요

확인해본 결과 서버에서 발급된 토큰을 TokenManager로 저장하는 과정에서 idToken이 누락되는 버그가 있었네요ㅠㅠ

불편을 끼쳐드려 죄송합니다.

해당 부분은 수정해서 빠른 시일 내에 배포할 수 있도록 하겠습니다.

SDK의 TokenManager는 별도로 커스텀해서 사용할 수 있도록 되어있는데요, 조금 번거로우시더라도 배포되기 전까지는 아래의 커스텀 TokenManager를 등록해서 사용 부탁드리겠습니다. (기존 SDK의 TokenManager에서 이슈 부분 수정한 코드입니다)

  • 커스텀 TokenManager 코드
class CustomTokenManager(
    private val appCache: PersistentKVStore = SharedPrefsWrapper(
        KakaoSdk.applicationContextInfo.sharedPreferences
    ),
    private val encryptor: Cipher = AESCipher(),
) : TokenManageable {
    private var currentToken: OAuthToken?

    init {
        currentToken = appCache.getString(tokenKey)?.let {
            try {
                KakaoJson.fromJson<OAuthToken>(
                    encryptor.decrypt(it),
                    OAuthToken::class.java
                )
            } catch (e: Throwable) {
                SdkLog.e(e)
                null
            }
        }
    }

    override fun getToken(): OAuthToken? = currentToken

    @Synchronized
    override fun setToken(token: OAuthToken) {
        val newToken = token.copy()
        try {
            appCache.putString(tokenKey, encryptor.encrypt(KakaoJson.toJson(newToken))).commit()
        } catch (e: Throwable) {
            SdkLog.e(e)
        }
        currentToken = newToken
    }

    override fun clear() {
        currentToken = null
        appCache.remove(tokenKey).commit()
    }

    companion object {
        const val tokenKey = "com.kakao.sdk.oauth_token"
    }
}
  • 커스텀 TokenManager 등록 코드
TokenManagerProvider.instance.manager = CustomTokenManager()

감사합니다

안녕하세요

내부 사정으로 인해 배포가 늦어졌네요… 제보주신 이슈 수정된 2.20.0 버전 배포되었습니다.

2.20.0 버전 이상부터는 제가 전달해드린 가이드 코드는 사용하지 않으셔도 정상적으로 동작합니다.

제보주셔서 다시 한번 감사합니다