Flutter - GoogleCloud에 OAuth 2.0 등록

김승호·2025년 1월 27일
0

필요성

  • Google Sign-In은 "SHA-1 인증서 지문이 등록된 keystore"가 없으면 안드로이드에서 구글 로그인이 제대로 동작하지 않는다.

구현

1. GoogleCloud에 OAuth 2.0 클라이언트 등록

  • 키스토어 파일은 Android 앱의 보안과 신뢰성을 보장하기 위해 사용되며, 앱이 인증된 소스로부터 제공되었음을 증명하는 데 필수적입니다.
  • Google Play 스토어에 앱을 업로드할 때, 반드시 앱이 "서명(Signing)" 되어 있어야 합니다.

과정

1. 앱 서명을 위한 keyStore 파일 생성

2. 키스토어 생성

  • 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

3. 키스토어에서 SHA-1 인증 뽑기 및 등록

keytool -keystore [키스토어경로]/키스토어이름.jks -list -v

해당 명령어 keystore 뒤에 키스토어로 만들어 낸 jks의 경로를 적어야 된다.
(난 keytool이 계속 문제여서 terminer의 위치를 jdk의 keytool의 위치로 해놓고 해당 명렁어의 jks 풀 경로를 적었다)

  • 해당 정보에 대한 sha-1를 찾고 아까 일단 정지 했던 단계에서 sha-1을 등록한다.

4. 추가 설정

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의 등록이 잘못 되었거나 패키지 경로를 잘못 입력했을 경우이니 두가지를 잘 살펴본 후 수정해준다.

2) 이해가 안되었던 것

1. signingConfigs

signingConfigs {
        release {
            keyAlias 'login-key'           // 키 별칭 (alias)
            keyPassword '**'    // 개별 키 비밀번호
            storeFile file('upload-keystore.jks')  // 키스토어 파일 경로
            storePassword '**'  // 키스토어 전체 비밀번호
        }
    }
  • 왜 signingConfig가 필요한가요?()
    Google Play 업로드를 위해 필수 : 모든 Android 앱은 배포 전에 디지털 서명이 필요합니다. (release로 등록)
profile
백준 : https://www.acmicpc.net/user/tmdghdhkdw (골드 - 2)

0개의 댓글