안드로이드 AUTHORIZATION_FAILED: invalid android_key_hash or ios_bundle_id or web_site_url
안녕하세요. 개발자 드리머즈입니다.
안드로이드 개발 중에 발생한 이슈 정리합니다.
문제 현상
저는 카카오 계정으로 로그인하기 기능을 이용하여 앱을 개발하고 있습니다. 카카오 계정으로 로그인하기 기능이 디버그 버전에서는 잘 동작했었는데 릴리즈 버전에서는 아래와 같이 에러가 뜨면서 카카오 계정으로 로그인하기 기능이 동작하지 않아 로그인이 되지 않았습니다.
1 2 3 4 5 6 7 8 9 10 11 | 03-25 15:48:31.582 19786-19786/? E/kakao.sdk: AUTHORIZATION_FAILED: invalid android_key_hash or ios_bundle_id or web_site_url at com.kakao.auth.AccessTokenCallback.onFailure(AccessTokenCallback.java:42) at com.kakao.network.callback.ResponseCallback.onFailureForUiThread(ResponseCallback.java:67) at com.kakao.network.tasks.KakaoResultTask$1$1.run(KakaoResultTask.java:79) at android.os.Handler.handleCallback(Handler.java:751) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6247) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:872) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:762) | cs |
문제 원인
예전 기억을 떠올려보면 카카오 계정으로 로그인하기 기능을 사용하기 위해 카카오 디벨로퍼 사이트에서 몇 가지 설정이 필요했습니다.
이 중에서 키 해시를 설정했던게 떠오릅니다.
키 해시에 대한 설명은 위와 같습니다. 그런데 이해가 잘 안가네요.
저는 아래의 코드로 캐 해시를 구해서 카카오 디벨로퍼 사이트에서 키 해시를 등록했었습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public static String getKeyHash(final Context context) { PackageInfo packageInfo = getPackageInfo(context, PackageManager.GET_SIGNATURES); if (packageInfo == null) return null; for (Signature signature : packageInfo.signatures) { try { MessageDigest md = MessageDigest.getInstance("SHA"); md.update(signature.toByteArray()); return Base64.encodeToString(md.digest(), Base64.NO_WRAP); } catch (NoSuchAlgorithmException e) { Log.w(TAG, "Unable to get MessageDigest. signature=" + signature, e); } } return null; } | cs |
그렇게 등록을 했지만 키 해시가 무엇인지 잘 몰라서 찾아봤습니다.
key hash(키 해시)는 앱을 사이닝 하는 키와 관련 있습니다.
지금까지는 계속 디버그 버전에서 테스트를 했기에 안드로이드 스튜디오에서 사용하는 디버그 키가 사용됐었습니다. 그리고 저는 그 디버그 키의 키 해시를 카카오 디벨로퍼 사이트에 등록했었습니다. 그래서 카카오 SDK의 API를 사용하는 앱의 키 해시를 검사하여 동일한 키로 사이닝 된 앱(=동일한 키 해시)은 문제없이 실행됐습니다.
그런데 제가 릴리즈 키를 사용하여 릴리즈 버전을 만들었기에 이 앱은 키 해시가 달라져버렸습니다. 이 변경된 키 해시는 카카오 디벨로퍼에 등록되지 않은 값이기 때문에 카카오 SDK에서 위의 에러를 발생시킨 것입니다.
결국 카카오 디벨로퍼에서 키 해시를 설정하는 목적은
특별한 키로 사이닝이 앱(=등록한 키 해시)에서만 '나'의 카카오 SDK API를 호출할 수 있게 하기 위함입니다. 이는 다른 사람이 만든 app에서 '내'가 사용하는 카카오 SDK의 API를 사용하지 못하도록 합니다.
해결 방법
위의 키 해시 구하는 함수를 릴리즈 키로 사이닝 된 앱을 실행하여 릴리즈 키의 키 해시(key hash)를 구합니다.
그리고 그 구한 값을 카카오 디벨로퍼 사이트의 키 해시 부분에 추가하면 됩니다.
댓글 영역