본문 바로가기

일::개발

Flutter: 안드로이드 소셜로그인/ invalid android_key_hash

Firebase를 이용한 구글 인증이나 카카오 인증을 구현하려면 각각의 플랫폼 관리 페이지(Firebase Console, https://developer.kakao.com)에 안드로이드 키 해시를 등록해줘야 한다. 

 

이전 포스트(https://uaremine.tistory.com/32 )에서 다뤘지만, 간단하게 다시 설명하면,

만들어진 바이너리는 개발자가 만든 정상적인 파일임을 확인하기 위해 개발자의 private키로 서명해서 배포하고, 다운로드한 클라이언트(안드로이드)는 개발자의 공개키로 해당 바이너리의 서명을 확인하는 절차를 거친다.

 

개발자 --> (개발자의 키로 서명) --> 서명된 바이너리 --> (개발자의 공개키로 확인) --> 클라이언트

 

그러나 요즘은 구글플레이에서 배포용 앱 서명을 제공하기 때문에, 구글 플레이를 통해서 배포된 바이너리는 개발자의 private 키가 아닌 구글의 키로 사이닝되어 있다.

 

바이너리 --> (구글의 키로 서명) --> 서명된 바이너리 --> (구글의 공개키로 확인) --> 클라이언트

 

개발자에 대한 확인은 개발자가 만든 바이너리를 구글 플레이에 업로드할 때 이루어진다. 

결국 간략히 하면 아래와 같은 절차로 바이너리가 전달된다.

 

개발자 --> (개발자의 키로 서명) --> 서명된 바이너리 --> (구글에서 개발자의 공개키로 확인) --> (구글의 키로 서명) --> 서명된 바이너리 --> (구글의 공개 키로 서명) --> 클라이언트

 

여기서 구글에 업로드하기 위한 개발자의 private 키를 upload key 라고 지칭한다.

 

결국, 우리가 사용할 키는 3가지가 된다.

로컬에서 개발에 사용할 debug key, 업로드를 위한 upload key, 구글에서 사이닝할 때 사용한 release key

 

flutter run 명령이나 VS Code 에서 run 해서 실행될 때는 debug 키가 사용된다.

debug 키는 

 

> keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore -storepass android -keypass android | openssl sha1

이렇게 얻을 수 있고, Firebase 콘솔에는 이대로 등록해주면 된다.

kakao 개발자 사이트에는 아래와 같이 나온 base64 값을 등록해준다.

 

> keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore -storepass android -keypass android | openssl sha1 -binary | openssl base64

 

구글에서 사이닝한 키는 구글 플레이 콘솔에서 얻을 수 있다. 

Setup > App Integrity > App Signing > App signing key certificate  > SHA-1 certificate fingerprint

값을 사용하면 된다.

 

카카오 등록을 위한 base64 스트링은

 

> echo "<위에서 얻은 키 값>" | xxd -r -p | openssl base64

 

이렇게 나온 값을 넣어주면 된다.

 

 

로컬에서 구글 플레이 등록하기 전에 릴리즈 바이너리를 테스트하고 싶다면 (flutter run --release), 각각의 플랫폼에 로컬에서 사이닝한 키 (업로드 키)를 등록해주면 된다.

 

정상적으로 설정 했다면, 업로드키 역시 구글 플레이 콘솔에 등록되어 있을텐데, 만약 아직 등록하기 전이라면 만들어둔 키스토어 파일에서 직접 얻을 수 있다.

 

> keytool -exportcert -alias <RELEASE_KEY_ALIAS> -keystore <RELEASE_KEY_PATH> | openssl sha1

 

flutter 가이드(https://docs.flutter.dev/deployment/android#signing-the-app)대로 했다면, 위의 정보는 key.properties 파일에 저장되어 있을 것이다.