본문 바로가기

안드로이드/자바

[안드로이드/Android] Firebase auth 구글 로그인 연동

반응형


해당 포스팅은 구글 로그인 연동에 관한 포스팅입니다.

안녕하세요 구글 로그인에 관하여 다시 구현하면서 변경된 점과 추가 할 사항이 있어 몇가지 더 적도록 하겠습니다. (2017.12.5)


1. API 콘솔 설정

 

구글 로그인을 사용하기 위한 사전 작업으로 링크를 통해 API 콘솔에 접속해 구글 로그인을 사용할 프로젝트를 생성합니다.




 

생성후 '사용자 인증정보' 탭으로 이동후 '사용자 인증 정보 만들기' 를 선택합니다.    

'OAuth 클라이언트 ID' 를 선택합니다. 


 

그리고 OAuth 동의 화면에 필요한 값들을 입력 후 아래와 같은 화면 빈칸을 채워주세요.

아래 정보중 서명 인증서 지문은 제 블로그 글을 참고해주세요. (SHA-1 지문을 얻는법)




2. Firebase Console 설정

 

제일 먼저 Firebase Console에서 프로젝트 생성 및 설정을 해야합니다.

링크를 통해 Firebase Console에서 프로젝트 추가를 누르고 프로젝트 목록에 1번 과정에서 생성한 프로젝트를 선택하시면 됩니다.


 

프로젝트 설정에서 안드로이드 앱 추가를 선택하시고 다음과 같은 화면의 값들을 입력해주세요.

패키지이름 : 안드로이드 프로젝트 패키지 이름

앱 닉네임 : 선택사항으로 본인이 식별 가능한 이름으로 작명

디버그 서명 인증서 SHA-1 : 선택사항 이지만 구글 로그인 사용시 필수 , 1번 과정에서 얻은값을 입력



다음 화면에서 'google-services.json' 파일을 다운받고 추가 절차를 따라주세요.


3. 프로젝트 설정

프로젝트에 Firebase를 사용하기 위한 작업이 필요합니다.

 

app단 gradle에 firebase 인증에 대한 종속 항목을 추가해야합니다.

compile 'com.google.firebase:firebase-auth:10.0.1'
compile 'com.google.android.gms:play-services-auth:10.0.1'

 프로젝트단 gradle에 추가 

dependencies {
....
classpath 'com.google.gms:google-services:3.1.0'//구글로그인
}


앱단 gradle 파일 제일 하단에 다음과 같이 추가해주세요.

 

dependencies {
....
}
apply plugin: 'com.google.gms.google-services'


4. 사용하기

 

실질적으로 구글 로그인을 사용하려는 엑티비티에 소스를 추가하겠습니다. 

구글 로그인에 대한 사전 세팅입니다.

FirebaseAuth.getInstance().signOut();

구글 로그인을 사용하다보면 로그인을 시도할때마다 목록을 불러오도록 해야 할 경우가 있습니다.

다음 코드를 통해 기존에 로그인 되어 있는 캐시(?) 정보가 있다면 로그아웃을 통해 사라지고 아이디들을 선택할 수 있습니다. 

상단 코드중 web client id 에 해당하는 값은 api콘솔에 OAuth 2.0 클라이언트 ID 에 있는 Web Client ID 값을 넣어 주시면 됩니다.


private void setGoogleLogin() {
FirebaseAuth.getInstance().signOut();

GoogleSignInOptions gso = new GoogleSignInOptions.Builder
(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken("web client id")
.requestEmail()
.build();

mGoogleApiClient = new GoogleApiClient.Builder(this)
.enableAutoManage(this /* FragmentActivity */,
new GoogleApiClient.OnConnectionFailedListener() {
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}
} /* OnConnectionFailedListener */)
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
}

 

구글 로그인이 필요한 시점에 아래와 같은 메소드를 실행 시켜주시면 됩니다.


private void loginGoogle() {
Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
startActivityForResult(signInIntent, SIGN_IN);
}

 

로그인이 성공하면 아래와 같은 값들을 상황에 맞게 처리합니다.


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

callbackManager.onActivityResult(requestCode, resultCode, data);

if (requestCode == SIGN_IN) {
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);

if (result != null) {
if (result.isSuccess()) {

// 로그인 성공 했을때
GoogleSignInAccount acct = result.getSignInAccount();

String personName = acct.getDisplayName();
String personEmail = acct.getEmail();
String personId = acct.getId();
String tokenKey = acct.getServerAuthCode();

mGoogleApiClient.disconnect();


Log.e("GoogleLogin", "personName=" + personName);
Log.e("GoogleLogin", "personEmail=" + personEmail);
Log.e("GoogleLogin", "personId=" + personId);
Log.e("GoogleLogin", "tokenKey=" + tokenKey);


} else {
Log.e("GoogleLogin", "login fail cause=" + result.getStatus().getStatusMessage());
// 로그인 실패 했을때
}
}
} else {


}
}

 

사용자가 정상적으로 로그인한 후에 Firebase 사용자 인증 정보로 교환합니다.


private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {
Log.d(TAG, "firebaseAuthWithGoogle:" + acct.getId());

AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
mAuth.signInWithCredential(credential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
Log.d(TAG, "signInWithCredential:onComplete:" + task.isSuccessful());

// If sign in fails, display a message to the user. If sign in succeeds
// the auth state listener will be notified and logic to handle the
// signed in user can be handled in the listener.
if (!task.isSuccessful()) {
Log.w(TAG, "signInWithCredential", task.getException());
Toast.makeText(MainActivity.this, "Authentication failed.",
Toast.LENGTH_SHORT).show();
}
// ...
}
});
}



구글 로그인은 위 처럼 커스텀 버튼이 아닌 공식적으로 제공해주는 버튼 또 한 존재합니다. 

하지만 다른 SNS와는 조금 다르게 클릭 이벤트를 따로 지정해줘야 합니다.




먼저 lauout.xml에 로그인 버튼을 생성하고 엑티비티에 선언과 할당을 위한 코드를 작성합니다

 

<com.google.android.gms.common.SignInButton
android:id="@+id/google_login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/> 

SignInButton signInButton = (SignInButton) findViewById(R.id.sign_in_button);
signInButton.setSize(SignInButton.SIZE_STANDARD);

signInButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {

Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
startActivityForResult(signInIntent, RC_SIGN_IN);
}
});






참조 



 


해당 포스팅은 지극히 객관적인 내용으로 저자의 복기 목적으로 작성된 것이고, 내용에대해 수정이나 추가 요청은 언제든 환영합니다. 






반응형