구글 로그인 연동(with 파이어베이스)
구글 로그인 연동을 하려면
사전에 파이어베이스에
프로젝트 생성 및 설정이
되어 있어야 합니다.
2024.08.30 - [스마트웹앱콘텐츠전문가/안드로이드] - 인증서 지문 획득
해당 포스팅에서는
사전 과정을 마친 이후에
진행을 합니다.
○ 안드로이드 환경 : SDK(안드로이드 API 21 이상), JDK(JDK 11이상), Gradle 빌드
1. 환경 설정
1-1. 파이어베이스 프로젝트에서 google-services.json 다운로드 받아
해당 프로젝트 루트 디렉터리에 추가.
1-2. 파이어베이스(Firebase) SDK 추가
프로젝트 수준의 build.gradle 파일에 플러그인을 종속 항목으로 추가
plugins {
// ...
// Add the dependency for the Google services Gradle plugin
id 'com.google.gms.google-services' version '4.4.2' apply false
}
모듈(앱 수준) build.gradle 파일에서 google-services 플러그인과 앱에서 사용할 Firebase SDK를 모두 추가
plugins {
id 'com.android.application'
// Add the Google services Gradle plugin
id 'com.google.gms.google-services'
...
}
dependencies {
// Import the Firebase BoM
implementation platform('com.google.firebase:firebase-bom:33.2.0')
// TODO: Add the dependencies for Firebase products you want to use
// When using the BoM, don't specify versions in Firebase dependencies
// https://firebase.google.com/docs/android/setup#available-libraries
// Add the dependency for the Firebase Authentication library
// When using the BoM, you don't specify versions in Firebase library dependencies
implementation("com.google.firebase:firebase-auth:16.0.4")
// Also add the dependency for the Google Play services library and specify its version
implementation("com.google.android.gms:play-services-auth:20.1.0")
}
gradle sync 또는 빌드를 해주어 오류가 나는 지 확인해봅시다.
참고) 파이어베이스 SDK가 google-services.json 구성 값에 액세스할 수 있도록 하려면 구글 서비스 gradle 플러그인 필요.
2. 로그인 로직 : 해당 로직을 통해 로그인을 진행할 수 있습니다.
파이어베이스를 사용한 구글 로그인을 진행해보았습니다.
※로그인 후, 사용자 정보를 가져오는 것도 포함
2-1. 레이아웃 파일에 Google 로그인 버튼 생성
예시) 커스텀하지 않은 구글 로그인 버튼 생성함.
<com.google.android.gms.common.SignInButton
android:id="@+id/googleBtn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_margin="20dp"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp"
/>
2-2. 액티비티 파일에 로그인 버튼에 대한 로직 추가 :
private String RC_SIGN_IN = "9001";
private GoogleSignInAccount gsa;
private GoogleSignInClient mGoogleSignInClient;
~
SignInButton g_login_button = (SignInButton)findViewById(R.id.googleBtn);
~
mGoogleSignInClient = GoogleSignIn.getClient(AuthActivity.this, gso);
~
//버튼 클릭 리스너
g_login_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.d("G_LOGIN_BTN", "구글 로그인 버튼 클릭 ");
// 기존에 로그인 했던 계정을 확인한다.
gsa = GoogleSignIn.getLastSignedInAccount(AuthActivity.this);
if(gsa != null){
// 로그인 되있는 경우, 사용자 정보 확인
Log.i("G_LOGIN", gsa.getId());
Log.i("G_LOGIN", String.valueOf(gsa.getAccount()));
Log.i("G_LOGIN", gsa.getEmail());
Log.i("G_LOGIN", gsa.getDisplayName());
Log.i("G_LOGIN", String.valueOf(gsa));
}else{
// 로그인 진행
Log.i("G_LOGIN", "로그인 진행");
}
Intent intent = mGoogleSignInClient.getSignInIntent(); //구글로그인 페이지로 가는 인텐트 객체
startActivityForResult(intent, Integer.parseInt(RC_SIGN_IN)); //Google Sign In flow 시작
//finish();
}
});
~
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// Result returned from launching the Intent from GoogleSignInClient.getSignInIntent(...);
if (requestCode == Integer.parseInt(RC_SIGN_IN)) {
Log.d("G_LOGIN_RESULT_ON_ACTI", requestCode + "/" + resultCode + "/" + data);
// The Task returned from this call is always completed, no need to attach a listener.
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
handleSignInResult(task);
}
}
○ GoogleSignInAccount
○ GoogleSignInClient
※ onActivityResult 의 로직을 유의깊게 봐야 함.
- 로그인을 하고 난 뒤에 onActivityResult가 호출되며, GoogleSignInAccount 객체를 얻음.
3. 사용자 정보 가져오기 : 로그인한 사용자의 프로필 정보를 가져올 수 있습니다.
//사용자 정보 가져오기
private void handleSignInResult(Task<GoogleSignInAccount> task){
try {
Log.d("G_LOGIN_handleSignInResult 진입", String.valueOf(task.isSuccessful()) );
GoogleSignInAccount acnt = task.getResult(ApiException.class);
Log.d("G_LOGIN_handleSignInResult", acnt.getId());
if(acnt != null){
//사용자 정보 존재
firebaseAuthWithGoogle(acnt.getIdToken());
String personName = acnt.getDisplayName();
String personGivenName = acnt.getGivenName();
String personFamilyName = acnt.getFamilyName();
String personEmail = acnt.getEmail();
String personId = acnt.getId();
Uri personPhoto = acnt.getPhotoUrl();
Log.d("G_LOGIN_USER", "handleSignInResult:personName "+personName);
Log.d("G_LOGIN_USER", "handleSignInResult:personGivenName "+personGivenName);
Log.d("G_LOGIN_USER", "handleSignInResult:personEmail "+personEmail);
Log.d("G_LOGIN_USER", "handleSignInResult:personId "+personId);
Log.d("G_LOGIN_USER", "handleSignInResult:personFamilyName "+personFamilyName);
Log.d("G_LOGIN_USER", "handleSignInResult:personPhoto "+personPhoto);
}
}catch (ApiException e){
// The ApiException status code indicates the detailed failure reason.
// Please refer to the GoogleSignInStatusCodes class reference for more information.
Log.e("G_LOGIN_EXCEPT", "signInResult:failed :" + e.getStatusCode());
Log.e("G_LOGIN_EXCEPT", "signInResult:failed :" + e.getMessage());
Log.e("G_LOGIN_EXCEPT", "signInResult:failed :" + e.getStatus());
}
finish();
}
4. 파이어베이스 활용 : 토큰을 가지고 파이어베이스를 통하여 사용자 정보를 조회할 수 있습니다.
private FirebaseAuth mAuth;
~
private void firebaseAuthWithGoogle(String token){
Log.d("G_LOGIN_firebaseAuthWithGoogle", token);
AuthCredential credential = GoogleAuthProvider.getCredential(token, null);
mAuth.signInWithCredential(credential)
.addOnCompleteListener(AuthActivity.this, task -> {
if(task.isSuccessful()){
// Sign in success, update UI with the signed-in user's information
Log.d("G_LOGIN_FirebaseAuth_Secc", "signInWithCredential:success");
FirebaseUser user = mAuth.getCurrentUser();
Log.d("G_LOGIN_Fire_USER", "handleSignInResult:uid "+user.getUid());
Log.d("G_LOGIN_Fire_USER", "handleSignInResult:phone "+ user.getPhoneNumber());
Log.d("G_LOGIN_Fire_USER", "handleSignInResult:personEmail "+user.getEmail());
Log.d("G_LOGIN_Fire_USER", "handleSignInResult:personName "+user.getDisplayName());
Log.d("G_LOGIN_Fire_USER", "handleSignInResult:photourl "+user.getPhotoUrl());
Log.d("G_LOGIN_Fire_USER", "handleSignInResult:providerId "+user.getProviderId());
} else{
// If sign in fails, display a message to the user.
Log.w("G_LOGIN_FirebaseAuth_Exce", "signInWithCredential:failure", task.getException());
}
});
}
5. 구현동작 확인.
구글 로그인 버튼 클릭.
구글 로그인 화면 진입
(여러개의 구글 아이디가 등록되어 있는 경우, 다음과 같이
구글 아이디 1,2,3을 선택하라는 화면이 노출됩니다.)
※구글 로그인 연동은 파이어베이스 없이 구글 로그인 연동이 가능합니다만,
파이어베이스를 거쳐서 연동을 진행하게 되면, 설정 부분에서
파이어베이스가 진행을 해주므로, 보다 간단하게 진행할 수 있습니다.
2024.08.27 - [스마트웹앱콘텐츠전문가/안드로이드] - 페이스북 로그인 연동
2024.08.27 - [스마트웹앱콘텐츠전문가/안드로이드] - 카카오 로그인 연동
2024.08.27 - [스마트웹앱콘텐츠전문가/안드로이드] - 네이버 로그인 연동(네아로)