현재 디버그용은 잘 동작하는데
릴리즈로 사이닝만 하면 정상적으로 동작이 안되네요
해시키는 기존에 getHashKey 함수를 써서 뽑아와서 잘 썼었구요
저번주만해도 잘되던게 어제 갑자기 카카오 로그인이 안되네요
혹시 버그인가요?혹은 해결방법이 있을까요?
현재 디버그용은 잘 동작하는데
릴리즈로 사이닝만 하면 정상적으로 동작이 안되네요
해시키는 기존에 getHashKey 함수를 써서 뽑아와서 잘 썼었구요
저번주만해도 잘되던게 어제 갑자기 카카오 로그인이 안되네요
혹시 버그인가요?혹은 해결방법이 있을까요?
혹시 Google play app signing 기능을 최근에 키셨나요?
Google Play App Signing을 사용하시게 되면 개발자님이 직접 사인하시는 키를 지우고 구글 서버에 저장되어 있는 키를 통하여 다시 사인하게 되는데요. 이 과정 떄문에 직접 릴리즈 빌드하신 버전과 마켓에서 다운로드 받은 버전이 전혀 다른 키해시를 가지게 됩니다.
구글 플레이 디벨로퍼 콘솔에서 알파, 베타 버전에 APK 업로드 하신 것을 다운 받으려고 하시면 original 버전과 derived 버전이 있는 것을 보실 수 있는데요
Original은 개발자님이 직접 릴리즈키로 사인하신 그대로의 apk이구요, Derived는 개발자님이 사인하신 것을 구글이 삭제하고 서버에 있는 릴리즈키를 사용하여 다시 사인한 apk가 됩니다. 두 키가 다르기 때문에 키해시 값이 달라지는 것이구요.
이 때 기존의 릴리즈키로 잘 동작하게 하려면 릴리즈키를 PEPK라는 툴을 통하여 프라이빗키를 추출하여 구글에 업로드하는 스텝을 거치셔야 구글이 빌드를 할 때 이 키를 사용하게 되어 문제가 없는데, 이 스텝을 거치시지 않은 것 같아요.
https://stackoverflow.com/questions/44103024/how-to-enable-google-play-app-signing/44103025
앱이 새로운 사이닝키를 사용하게 되도 문제가 없다면 모르겠는데 문제가 있다면 위 링크에 있는 절차를 밟으시는게 어떨까 합니다. 최근에 발생한 이슈라 저도 지금 막 테스트 해보고 있어서 정확히 알고있지 못할수도 있어요. 만약 틀린 부분이 있다면 알려주시면 감사하겠습니다~
예전에 올린 다른 앱들은 말씀하신 것처럼
해당 버튼들이 나와있습니다.
그런데 이번에 올린것들은 사이닝을 사용하기에 체크를 해서 그런지, PEPK를 올릴 수 있는 버튼이 없네요
뒤로 돌릴수도 없고… 이 경우는 어떻게 해결해야 할까요?
구글이 기존 앱들은 이미 사용하던 릴리즈 사이닝키를 업로드할 수 있는 방법을 제공하고 새로운 앱들은 제공하지 않는 것 같네요… 앱 서명 인증서에 있는 SHA-1 인증서 지문으로 키해시를 알아낼 수 있을 것 같아요 기본적으로 키해시는 다음과 같은 절차를 거져 생성됩니다.
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;
}
여기서 보시게 되면 SHA-1 인증서 지문을 Base64 인코드하는걸 보실 수 있습니다. 자바 코드에서 위의 SHA-1 인증서 지문을 byte array 로 만드셔서 똑같은 절차를 거치시면 키해시를 얻으실 수 있을 것 같아요.
위의 SHA-1 인증서 지문을 다음과 같이 byte array로 만들어 주신 다음에 Base64 인코딩 해보세요.
byte[] sha1 = {
0x3B, (byte)0xDA, (byte)0xA0, 0x5B, 0x4F, 0x35, 0x71, 0x02, 0x4E, 0x27, 0x22, (byte)0xB9, (byte)0xAc, (byte)0xB2, 0x77, 0x2F, (byte)0x9D, (byte)0xA9, (byte)0x9B, (byte)0xD9
};
Logger.e("keyHash: " + Base64.encodeToString(sha1, Base64.NO_WRAP));
byte의 범위를 넘어가는 값들이 있는데 이 값들은 byte로 캐스트해주셔야 합니다. Base64는 java.util 패키지에 있는 클래스이구요. 이렇게 출력된 값을 한번 개발자 사이트에 등록해보신 후 로그인 시도해 보시겠어요?
이렇게 하니까 되네요. 감사합니다