- Google Sign-In은 "SHA-1 인증서 지문이 등록된 keystore"가 없으면 안드로이드에서 구글 로그인이 제대로 동작하지 않는다.
- 키스토어 파일은 Android 앱의 보안과 신뢰성을 보장하기 위해 사용되며, 앱이 인증된 소스로부터 제공되었음을 증명하는 데 필수적입니다.
- Google Play 스토어에 앱을 업로드할 때, 반드시 앱이 "서명(Signing)" 되어 있어야 합니다.
1. 앱 서명을 위한 keyStore 파일 생성
- 1) 구글 클라우드 접속 및 프로젝트 생성 (https://console.cloud.google.com/)
- 2) api 및 서비스에 OAuth 동의 화면 큵기
- 3) OAuth 클라이언트 만들기 클릭 및 해당하는 정보 입력
- 등록 도움 자료 https://velog.io/@qazws78941/FlutterGoogle-Login-%EA%B5%AC%ED%98%84
해당하는 단계에서 일단 정지 (keyTool을 통해서 해당 SHA-1 인증서 디지털 지문을 등록해야 된다.)
- 1) cmd에서 jdk의 bin폴더 내부로 진입 (여기에 keyStore 생성을 위한 ketTool이 있다.)
- 2) cmd에
keytool -genkey -v -keystore [ 키 저장소의 경로 및 파일명 지정].jks -alias [키 별칭] -storepass [ 키 저장소(.jks) 파일을 열 때 사용할 비밀번호] -keypass [개별 키를 사용할 때 필요한 개별 키 비밀번호] -keyalg RSA -keysize 2048 -validity 10000 입력- storepass와 keypass는 보통 동일하게 짓는다.
예시)
keytool -genkey -v -keystore C:\Users\사용자명.android\debug_keystore.jks -alias androiddebugkey -storepass android -keypass android -keyalg RSA -keysize 2048 -validity 10000- 키스토어 생성 도움 자료 : https://www.youtube.com/watch?v=Omro40jFspo
- https://www.youtube.com/watch?v=Omro40jFspo (해당 영상 6:22초)
keytool -keystore [키스토어경로]/키스토어이름.jks -list -v해당 명령어 keystore 뒤에 키스토어로 만들어 낸 jks의 경로를 적어야 된다.
(난 keytool이 계속 문제여서 terminer의 위치를 jdk의 keytool의 위치로 해놓고 해당 명렁어의 jks 풀 경로를 적었다)
- 해당 정보에 대한 sha-1를 찾고 아까 일단 정지 했던 단계에서 sha-1을 등록한다.
1. app/build.gradle에 정보 등록
signingConfigs { debug { keyAlias // 키 별칭 (alias) keyPassword // 개별 키 비밀번호 storeFile file() // 키스토어 파일 경로 storePassword // 키스토어 전체 비밀번호 } }이와 같이 해당하는 정보를 등록한다. (debug용 release용)
2. app/src/profile/AndroidManifest.xml에 정보 등록
<application> <meta-data android:name="com.google.android.gms.auth.api.signin.WebClientId" android:value="google Cloud에 OAuth 2.0 클라이언트 ID를 복사해서 넣기"/> </application>3. app/build.gradle에 defendency 등록
dependencies { implementation 'com.google.android.gms:play-services-auth:20.7.0' }4. 테스트 자료
import 'package:flutter/material.dart'; import 'package:google_sign_in/google_sign_in.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( debugShowCheckedModeBanner: false, home: GoogleLoginScreen(), ); } } class GoogleLoginScreen extends StatefulWidget { @override _GoogleLoginScreenState createState() => _GoogleLoginScreenState(); } class _GoogleLoginScreenState extends State<GoogleLoginScreen> { final GoogleSignIn _googleSignIn = GoogleSignIn( scopes: [ 'email', ], ); GoogleSignInAccount? _currentUser; // Google 로그인 처리 Future<void> _handleSignIn() async { try { final GoogleSignInAccount? user = await _googleSignIn.signIn(); setState(() { _currentUser = user; }); } catch (error) { print("Google 로그인 실패: $error"); } } // Google 로그아웃 처리 Future<void> _handleSignOut() async { await _googleSignIn.signOut(); setState(() { _currentUser = null; }); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("Google 로그인 테스트"), ), body: Center( child: _currentUser == null ? Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text("로그인하지 않았습니다."), SizedBox(height: 20), ElevatedButton( onPressed: _handleSignIn, child: Text("Google 로그인"), ), ], ) : Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text("환영합니다, ${_currentUser!.displayName}!"), SizedBox(height: 10), Text("이메일: ${_currentUser!.email}"), SizedBox(height: 20), ElevatedButton( onPressed: _handleSignOut, child: Text("로그아웃"), ), ], ), ), ); } }
과정을 진행 중 잘 안되 거나 이해가 안됬던 것
1) 잘 안됬던 것
1. yes
해당 키 등록 시 yes를 마지막에 써라고 했지만 난 잘 안됬다. 다른 자료를 보니 yes 대신 y를 한 사람이 있어서 해보니 되었다;;2. PlatformException(sign_in_failed, com.google.android.gms.common.api.ApiException: 10: , null, null) 뜰 경우
- SHA-1의 등록이 잘못 되었거나 패키지 경로를 잘못 입력했을 경우이니 두가지를 잘 살펴본 후 수정해준다.
signingConfigs {
release {
keyAlias 'login-key' // 키 별칭 (alias)
keyPassword '**' // 개별 키 비밀번호
storeFile file('upload-keystore.jks') // 키스토어 파일 경로
storePassword '**' // 키스토어 전체 비밀번호
}
}