본문 바로가기

안드로이드

FCM (Firebase Cloud Messaging) 구글 로그인 연동

지난 포스팅에서는 간단하게 FCM과 안드로이드 스튜디오로 생성한 프로젝트의 연동에 대하여 실습하였다. 간단하게 요약하자면 FCMtest라는 프로젝트를 파이어베이스에 생성한 후 생성된 파이어베이스의 프로젝트와 안드로이드 스튜디오로 만든 fcm_test라는 프로젝트를 연동한 것이다. 


참고: https://neosla.tistory.com/24


이제 파이어베이스를 사용할 준비가 끝난 것이니 앞으로 파이어베이스의 기능들을 하나씩 사용하는 포스팅을 해볼까 한다. 따라서!!! 본 포스팅 에서는 구글 버튼을 이용해 구글 로그인이 가능한 기능을 구현해볼까 한다. 


내용은 간단하다. 파이어베이스에서 구글 로그인 기능을 활성화 시킨 후 안드로이드 스튜디오로 돌아와 구글에서 제공하는 로그인 버튼과 기능을 구현해주면 접속하였을때 파이어베이스에 로그인 정보가 들어가게 된다. 핸드폰에 기존 구글 계정이 저장되어 있다면 바로 로그인이 가능할 것이다. 본론으로 들어가 실습을 하도록하겠다. 


* 파이어베이스 계정과 안드로이드 스튜디오의 프로젝트는 지난번 포스팅의 프로젝트를 활용하여 구축하였다. 만약 이전의 단계가 필요하다면 지난 포스팅을 참고 바란다.*


1. 파이어베이스 구글 로그인 기능 활성화




기능 구현을 하기에 앞서 위의 그림과 같이 파이어베이스로 접속을 해야한다. 좌측 상단에 보면 개발 -> Authentication -> 로그인 방법 으로 들어가면 다양한 기능들이 존재하는 것을 볼 수 있다. 단순 이메일, 구글, 페이스북, 트위터 등으로 로그인이 가능하지만 본 포스팅에서는 구글 로그인만 다루기 때문에 구글 로그인을 활성화 시켜주기 바란다.




프로젝트의 공개용 이름은 자동으로 적히고 프로젝트 지원 이메일은 나의 구글 이메일을 적어주고 저장을 눌러주면 파이어베이스에서 해야할 일은 끝이다.


2. gradle 추가 (build.gradle)


이제 안드로이드 스튜디오로 돌아가 app 수준의 gradle에 구글 로그인 기능을 사용하기 위해 Firebase의 인증에 대한 종속 항목을 추가해줘야 한다.


implementation 'com.google.firebase:firebase-auth:16.1.0'
implementation 'com.google.android.gms:play-services-auth:16.0.1'


아마 이전의 포스팅의 프로젝트를 진행했던분이라면 firebase-core 부분은 추가가 되어 있을 것이다. 또한 중요사항으로 본 포스팅을 진행하는 시점에서는 위의 버전이 최신 버전이지만, 향 후 버전이 높아질 경우 안드로이드 스튜디오에서 자동으로 인식을 해주는 경우가 있다 이럴때 sync 자체는 문제가 되지 않지만 최신버전을 유지해주는 것이 권장사항이기 때문에 버전이 현재와 다르다면 최시버전으로 맞춰주고 진행을 해도 문제가 되지 않는다. 


3. 레이아웃 구성 


content_main.xml


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


메인 레이아웃에 구글 버튼을 추가해줘야 한다. 위에처럼 넣으면 자동으로 구글에서 제공하는 구글 마크와 Sign In 이 들어간 로그인 버튼이 자동으로 생성된다.


activity_login_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<LinearLayout
android:orientation="vertical"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:layout_margin="16dp"
android:layout_width="match_parent"
android:layout_height="match_parent">

<ImageView
android:src="@mipmap/ic_launcher"
android:layout_gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

<Button
android:id="@+id/buttonLogout"
android:text="로그아웃"
android:layout_gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</android.support.constraint.ConstraintLayout>


구글 로그인에 성공했을경우 넘어가는 페이지를 간단게 만들어 봤다. 단순히 로그인을 하면 해당 레이아웃 디자인이 적용된 액티비티로 넘어가게 되고 단순히 로그아웃 하나만 버튼을 구현해놨다. 


4. 메니페스트 설정


AndroidManifest.xml

<activity
android:name=".LoginMainActivity">
</activity>


LoginMainActivity는 구글 로그인이 성공 했을 경우 넘어가는 페이지에 해당한다. 해당 클래스를 만들기 전에 메니페스트에서 미리 선언을 해준다.


5. 클래스


MainActivity.java


import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

import com.google.android.gms.auth.api.Auth;
import com.google.android.gms.auth.api.signin.GoogleSignInAccount;
import com.google.android.gms.auth.api.signin.GoogleSignInOptions;
import com.google.android.gms.auth.api.signin.GoogleSignInResult;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.SignInButton;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.AuthCredential;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.auth.GoogleAuthProvider;

import static android.content.ContentValues.TAG;

public class MainActivity extends AppCompatActivity implements GoogleApiClient.OnConnectionFailedListener,View.OnClickListener {

//Firebase
private static final int RC_SIGN_IN = 10;
private GoogleApiClient mGoogleApiClient;
private FirebaseAuth firebaseAuth;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

// 파이어베이스 인증 객체 선언
firebaseAuth = FirebaseAuth.getInstance();

//로그인 시도할 액티비티에서 유저데이터 요청
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id))
.requestEmail()
.build();

mGoogleApiClient = new GoogleApiClient.Builder(this)
.enableAutoManage(this, this)
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();

//구글로그인 버튼에 대한 이벤트
SignInButton button = (SignInButton) findViewById(R.id.btn_googleSignIn);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
System.out.println("클릭테스트");
//이벤트 발생했을때, 구글로그인 버튼에 대한 (구글정보를 인텐트로 넘기는 값)

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

}

//Intent Result 반환
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);

//RC_SIGN_IN을 통해 로그인 확인여부 코드가 정상 전달되었다면
if (requestCode == RC_SIGN_IN)
{
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);

//구글버튼 로그인 누르고 구글 사용자 확인시 실행
if (result.isSuccess())
{
// Google Sign In was successful, authenticate with Firebase
GoogleSignInAccount account = result.getSignInAccount();


Log.d(TAG, "이름 =" + account.getDisplayName());
Log.d(TAG, "이메일=" + account.getEmail());
Log.d(TAG, "getId()=" + account.getId());
Log.d(TAG, "getAccount()=" + account.getAccount());
Log.d(TAG, "getIdToken()=" + account.getIdToken());

//구글 이용자 확인된 사람정보 파이어베이스로 넘기기
firebaseAuthWithGoogle(account);
} else {
}
}
}

//구글 파이어베이스로 값넘기기
private void firebaseAuthWithGoogle(GoogleSignInAccount acct)
{
//파이어베이스로 받은 구글사용자가 확인된 이용자의 값을 토큰으로 받고
AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);

firebaseAuth.signInWithCredential(credential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>()
{
@Override
public void onComplete(@NonNull Task<AuthResult> task)
{
if (task.isSuccessful())
{
Intent intent = new Intent(getApplicationContext(), LoginMainActivity.class);
startActivity(intent);
finish();

Toast.makeText(MainActivity.this, "아이디 생성완료", Toast.LENGTH_SHORT).show();
} else
{

Toast.makeText(MainActivity.this, "아이디 생설실패", Toast.LENGTH_SHORT).show();
}
}
});
}


public void onStart()
{ // 사용자가 현재 로그인되어 있는지 확인
super.onStart();
// Check if user is signed in (non-null) and update UI accordingly.
FirebaseUser currentUser = firebaseAuth.getCurrentUser();
if(currentUser!=null)
{ // 만약 로그인이 되어있으면 다음 액티비티 실행
Intent intent = new Intent(getApplicationContext(), LoginMainActivity.class);
startActivity(intent);
finish();
}
}

@Override
public void onClick(View view) {

}

@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
Log.v("알림", "onConnectionFailed");
}

}


LoginMainActivity.class


import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

import com.google.firebase.auth.FirebaseAuth;

public class LoginMainActivity extends AppCompatActivity implements View.OnClickListener {

private Button buttonLogout;
private FirebaseAuth firebaseAuth;


@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login_main);

buttonLogout = (Button) findViewById(R.id.buttonLogout);
buttonLogout.setOnClickListener(this);
firebaseAuth = FirebaseAuth.getInstance();

}

@Override
public void onClick(View view) {
if(view == buttonLogout)
firebaseAuth.signOut();
finish();
startActivity(new Intent(this, MainActivity.class));
}
}


6. 결과





어플리케이션을 실행 후 가운데 구글 버튼을 클릭하면 로그인이 가능하다. 나의 경우에 스마트폰에 구글 계정 2개가 저장되어 있기때문에 구글계정 정보를 가져오게되고 이 중 선택을 해서 로그인이 가능하다. 로그인을 하게되면 앞서 설정한 로그인 이후 화면으로 넘어가게 된다.





파이어베이스로 접속해서 보면 방금 로그인한 계정의 정보가 올라와 있을 것이다.




본 포스팅에서는 FCM을 활용해 구글 로그인 기능을 구현해보았다. 앞서 말했듯이 파이어베이스를 활용하면 구글 이외의 페이스북 또한 설정을 통해 로그인이 가능하다. 따라서 다음 포스팅에서는 페이스북 로그인 기능에 대하여 구현해보도록 하겠다.


아래는 본 실습의 코드를 올려놓은 깃허브 페이지임. 다운로드해서 사용 ㄱㄱㄱ


https://github.com/songtaegeon/android_google_login