App/Android

[Android Studio] Google 로그인 인증 (3)

soyeon26 2019. 8. 18. 15:30

https://firebase.google.com/docs/auth/android/google-signin?authuser=0

 

Android에서 Google 로그인을 사용하여 인증하기  |  Firebase

앱에 Google 로그인을 통합하여 사용자가 Google 계정을 통해 Firebase에 인증하도록 할 수 있습니다. 시작하기 전에 아직 추가하지 않았다면 Android 프로젝트에 Firebase를 추가합니다. 프로젝트 수준 build.gradle 파일의 buildscript 및 allprojects 섹션에 Google의 Maven 저장소가 포함되어야 합니다. 다음과 같이 모듈(앱 수준) Gradle 파일(일반적으로 app/build.gradle)에 Fir

firebase.google.com

 


 

 

Google Sing In Button을  layout화면에 만들었다.

이제 MainActivity.java에서 버튼을 눌렀을 때 구글 계정으로 로그인 할 수 있도록 구현을 할 것이다.

 

 

일단 Button 먼저 만들어보자

AppCompatActivity에 SignInButton을 선언해 준다.

private SignInButton google_lgbtn;

그 다음 onCreate

google_lgbtn = findViewById(R.id.google_lgbtn);
        google_lgbtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //여기에 버튼 클릭시 실행될 코드 삽입
            }
        });

이렇게 하면 버튼이 완성된다!


 

대충 레이아웃을 꾸며 보았다.

 

이제 저 Sign in 버튼을 눌렀을때 구글 계정이 firebase에 사용자 등록이 되도록 만들면 된다.

 

 


 

1. onCreate 안에 코드를 입력한다.

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
        .requestIdToken(getString(R.string.default_web_client_id))
        .requestEmail()
        .build();

위 코드는 Google 로그인을 앱에 통합하는 코드다.

GoogleSignInOptions 객체를 구성할 때 requestIdToken을 호출합니다.

 

 

2.  //여기에 버튼 클릭시 실행될 코드삽입  주석 밑에 다음 코드를 입력한다.

Intent signInIntent = mGoogleSignInClient.getSignInIntent();
    startActivityForResult(signInIntent, RC_SIGN_IN);

 

3. 아래 코드를  AppCompatActivity안에 넣어준다. (onCreate 밖)

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

    // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...);
    if (requestCode == RC_SIGN_IN) {
        Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
        try {
            // Google Sign In was successful, authenticate with Firebase
            GoogleSignInAccount account = task.getResult(ApiException.class);
            firebaseAuthWithGoogle(account);
        } catch (ApiException e) {
            // Google Sign In failed, update UI appropriately
            // ...
        }
    }
}

 

4. 아래 코드를 GoogleSignInOptions gso 밑에 넣어준다.

 mGoogleSignInClient = GoogleSignIn.getClient(this, gso);

그다음 AppCompatActivity에 선언해준다.

private GoogleSignInClient mGoogleSignInClient;

빨간색으로 오류 밑줄이 뜨면 Alt+Enter를 누른다음

맨 위에 있는 걸 눌러주면된다!

 

 

5. RC_SIGN_IN에 빨간색으로 에러가 떠 있다. 

Alt+Enter 눌러주기
Create Field를 눌러주고

 

두번째 Login 눌러주기

private static final int RC_SIGN_IN = 10;

저렇게 코드가 뜨면 10을 넣어준다.

 

 

 

6. 아래 코드를  AppCompatActivity안에 넣어준다. onActivityResult 밑에 넣어주도록 하자

 private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {
        AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
        mAuth.signInWithCredential(credential)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (!task.isSuccessful()) {

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

그리고 나서 에러가 뜨는 TAG들을 지워준다.

 

 

 

7. AppCompatActivitymAuth를 선언해준다.

private FirebaseAuth mAuth;

그리고 onCreate에 아래 코드를 넣어준다.

mAuth = FirebaseAuth.getInstance();

 

 

 

8. AppCompatActivity 오른쪽에 implements GoogleApiClient.OnConnectionFailedListener를 이어서 넣어준다.

public class MainActivity extends AppCompatActivity implements GoogleApiClient.OnConnectionFailedListener

 

Alt+Enter 누른 다음 Implement methods 클릭
onConnectionFailed 선택 후 ok


 

여기까지 완료했다면 다시 Build를 해보자

맨 밑에 있는 Google Sign in 버튼을 눌러주면

 

짜잔 이렇게 구글 계정으로 로그인 할 수 있는 화면이 나온다! 계정을 클릭하고 다시 Firebase 콘솔로 돌아가보면

이렇게 계정이 등록되어있다.

 

 


 

참고할 최종 Login.java

package com.example.paik;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import com.google.android.gms.auth.api.Auth;
import com.google.android.gms.auth.api.signin.GoogleSignIn;
import com.google.android.gms.auth.api.signin.GoogleSignInAccount;
import com.google.android.gms.auth.api.signin.GoogleSignInClient;
import com.google.android.gms.auth.api.signin.GoogleSignInOptions;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.SignInButton;
import com.google.android.gms.common.api.ApiException;
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;

public class Login extends AppCompatActivity implements GoogleApiClient.OnConnectionFailedListener{

    private static final int RC_SIGN_IN = 10;
    private SignInButton google_lgbtn; //구글 로그인 버튼 선언
    public Button button_login; //로그인 버튼 선언
    public Button button_signup; //가입 버튼 선언

    private GoogleSignInClient mGoogleSignInClient;
    private FirebaseAuth mAuth;

    /*여기부터 onCreate*/
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        mAuth = FirebaseAuth.getInstance();

        /*구글 로그인 앱에 통합*/
        GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestIdToken(getString(R.string.default_web_client_id))
                .requestEmail()
                .build();

        mGoogleSignInClient = GoogleSignIn.getClient(this, gso);

        /*로그인 버튼*/
        button_login = findViewById(R.id.button_login);
        button_login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getApplicationContext(),MainActivity.class);
                startActivity(intent);
            }
        });

        /*가입 버튼*/
        button_signup = findViewById(R.id.button_signup);
        button_signup.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getApplicationContext(),Signup.class);
                startActivity(intent);
            }
        });

        /*구글 로그인 버튼*/
        google_lgbtn = findViewById(R.id.google_lgbtn);
        google_lgbtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //여기에 버튼 클릭시 실행될 코드 삽입
                Intent signInIntent = mGoogleSignInClient.getSignInIntent();
                startActivityForResult(signInIntent, RC_SIGN_IN);
            }
        });
    }/*onCreate 끝!*/

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

        // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...);
        if (requestCode == RC_SIGN_IN) {
            Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
            try {
                // Google Sign In was successful, authenticate with Firebase
                GoogleSignInAccount account = task.getResult(ApiException.class);
                firebaseAuthWithGoogle(account);
            } catch (ApiException e) {
                // Google Sign In failed, update UI appropriately
                // ...
            }
        }
    }

    private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {
        AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
        mAuth.signInWithCredential(credential)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (!task.isSuccessful()) {

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

    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

    }
}/*AppCompatActivity 끝!*/