Kakao SDK 통해 로그인을 개발하고 있습니다.
문의 1.
kakao 로그인 이후 appkey 이름을 가진 shared pref 파일안에 access token, refresh token 을 직접 가져다 사용해도 될까요?
해당 pref 는 multi process 지원하나요?
Session.getCurrentSession().tokenInfo.accessToken 를 통해 가져오는 token 은 해당 preference 에서 가져오는것인지
궁금합니다
문의 2. refresh token 까지 만료가 되면 재로그인이 필요하다고 본것 같습니다.
UserManagement.getInstance().me(callback) 만 호출하면 자동 로그인이 되나요? 아니면 기존에 저장했던
user 정보를 다 지우고 로그인화면부터 보여야 하나요?
access token , refresh token 만료 테스트를 쉽게 하려면 어떻게 해야 하는지도 궁금합니다
안녕하세요.
-
직접 가져다 사용하셔도 상관은 없습니다만 만료 상황 등 고려할 부분이 있어서 조금 더 개발에 신경을 써주셔야할 것 같습니다. SDK 에서 사용하는 prefs 는 멀티프로세스 지원을 하지 않습니다. SDK 에서 사용하는 토큰 정보들은 해당 prefs 에서 가져오는게 맞습니다.
-
리프레시토큰이 만료된 경우에는 API 메소드 호출 시 에러콜백이 호출됩니다. 기존에 저장했던 정보를 다 지우고 로그인 화면부터 노출시켜 유저가 재로그인하도록 해야 합니다.
만료테스트는 정확하게 만료를 시킨 상태를 테스트할 수 있는 방법은 지금은 없구요 ㅠ.ㅠ 카카오 게정 비밀번호 변경, 연결된 서비스 관리에서 언링크 등을 통하여 비슷한 환경을 테스트하실 수 있습니다. 요 부분은 더 깔끔하게 테스트할 수 있는 방식이 없는지 한번 논의해 보겠습니다…!
답변 감사합니다.
저희가 개발하는 앱은 멀티 프로세스 입니다
각 프로세스에서 Kakao SDk.init 을 수행하고
각 프로세스에서 session 을 open 하고
val token = Session.getCurrentSession().tokenInfo.accessToken
통해 가져오면 이슈가 없을까요?
결국 각 프로세스에서 pref 에 동시에 접근할수 있는데 다른 프로세스에서
token 을 가져오거나 update 를 못할수도 있는지 확인이 필요합니다.
기존에 prefs 와 멀티 프로세스 이슈가 많아서 걱정이 되어 문의드립니다
한 프로세스에서 init 을 호출하고 다른 프로세스들에서는 ContentProvider 등을 통하여 가져오는 방식이 어떨까요?
한 때 SharedPreferences가 지원하던 file creation mode 인 MODE_MULTI_PROCESS 가 deprecate 되었거든요. 해당 constant 가 정의된 곳에 가보면 아래와 같은 comment 가 있습니다.
/**
* SharedPreference loading flag: when set, the file on disk will
* be checked for modification even if the shared preferences
* instance is already loaded in this process. This behavior is
* sometimes desired in cases where the application has multiple
* processes, all writing to the same SharedPreferences file.
* Generally there are better forms of communication between
* processes, though.
*
* <p>This was the legacy (but undocumented) behavior in and
* before Gingerbread (Android 2.3) and this flag is implied when
* targeting such releases. For applications targeting SDK
* versions <em>greater than</em> Android 2.3, this flag must be
* explicitly set if desired.
*
* @see #getSharedPreferences
*
* @deprecated MODE_MULTI_PROCESS does not work reliably in
* some versions of Android, and furthermore does not provide any
* mechanism for reconciling concurrent modifications across
* processes. Applications should not attempt to use it. Instead,
* they should use an explicit cross-process data management
* approach such as {@link android.content.ContentProvider ContentProvider}.
*/
@Deprecated
public static final int MODE_MULTI_PROCESS = 0x0004;
만약 concurrency 에 관련한 이슈들이 걱정되신다면 위 가이드대로 개발하시는 것을 추천드립니다!
SDK 에서 멀티 프로세스를 지원하지 않는다면… 말씀하신대로 한 프로세스에서는 sdk 를 통해 accesstoken 을 가져오고
다른 프로세스에서는 ContentProvider 와 같은 interface 를 이용해 해당 값을 가져가야 합니다.
그럼 저희 앱의 경우 아래 문제점이 있을것 같은데 이해한 점이 맞을까요?
(UI 프로세스, Service 프로세스 가 존재 할 경우)
case 1. 프로세스 수명이 긴 Service 에서 KakaoSdk.Init 을 수행할 경우.
access token 갱신에 유리합니다. 하지만
UI 프로세스에서는 session.open 을 할수 없고 이 의미는 카카오 로그인을 할수 없습니다.
-> 구현 불가(?)
case 2. UI 프로세스 에서 Kakao.init 을 수행할 경우
UI 가 필요 없는 서비스 프로세스 에서 token 을 가져오기 위해 UI 프로세스가 살아나야 합니다.
-> case 1 이 구현 불가능하므로 (카카오 로그인 구현불가로 인해) 이 방법으로만 구현해야 함.
아니면 case 1 에서 카카오 sdk 를 통하지 않고 restapi 통해 로그인을 하는 식으로 다른 방법이 있을까요?
음… 멀티 프로세스에서 SDK 메소드를 호출하신다면 문제가 되겠네요. 현재 SDK 구조 상 로그인 기반 모든 메소드 호출은 KakaoSDK.init 호출이 전제가 되어있어야 하거든요.
로그인과 user API 호출 외에 카카오링크 같은 기능도 사용을 고려하고 계신건가요?
아직까지는 고려하지 않고 있습니다.
service 프로세스에서 kakaoSDK.init 을 호출하고
로그인 Activity 만 해당 프로세스에서 수행하는것으로 구현해보려고 합니다
UI 프로세스에서는 provider 통해 token 값 user 정보 값 가져가구요.
네네 알겠습니다. 구현 시에 혹시 이슈가 있으시면 알려주세요
안될것 같아요 ㅠ.ㅠ
기본은 UI Process 이고
sdk 를 service Process 에서 init 하였습니다.
대부분의 동작은 문제가 없었으나
카카오 계정으로 로그인 (해당 activity 도 Service Process) > 다른 카카오 계정으로 로그인
선택시 KakaoWebViewActivity 가 뜨지 않네요.
07-17 15:50:37.820 W 2721 2721 System.err:AUTHORIZATION_FAILED: Attempt to invoke virtual method com.kakao.auth.ISessionConfig com.kakao.auth.KakaoAdapter.getSessionConfig() on a null object reference
07-17 15:50:37.820 W 2721 2721 System.err:at com.kakao.auth.authorization.authcode.KakaoAuthCodeManager.onAuthCodeReceived(KakaoAuthCodeManager.java:247)
07-17 15:50:37.820 W 2721 2721 System.err:at com.kakao.auth.authorization.authcode.WebAuthCodeService.onWebViewCompleted(WebAuthCodeService.java:79)
07-17 15:50:37.820 W 2721 2721 System.err:at com.kakao.auth.authorization.authcode.WebAuthCodeService.onReceivedResult(WebAuthCodeService.java:101)
07-17 15:50:37.820 W 2721 2721 System.err:at com.kakao.auth.authorization.authcode.WebAuthCodeService$1.onReceiveResult(WebAuthCodeService.java:108)
process 를UI 프로세스로 설정해서 테스트 하면 전혀 문제가 없으나
Service 프로세르로 내리니까 webview Activity 가 안떠요.
아무래도 WebViewActivity 의 경우 우리 앱의 기본 프로세스에서 뜨려고 하나봐요.
<activity
android:name="com.kakao.auth.authorization.authcode.KakaoWebViewActivity"
android:configChanges="orientation|screenSize"
android:exported="false"
android:label="@string/com_kakao_login_button"
android:launchMode="singleTop"
android:windowSoftInputMode="adjustResize"
android:process=":XXX" />
</application>
앱내 manifest 에서 해당 값을 재지정하였더니 잘 되네요. 다행입니다
저희는 이런식으로 다른 프로세스에서 sdk init 후 사용하려고 합니다
혹시 다른 문제점이나 우려되는사항이 있다면 알려주세요
테스트 해보겠습니다