관리 메뉴

hyeals study

인스타그램 클론 (구글 로그인) 본문

안드로이드

인스타그램 클론 (구글 로그인)

hyeals 2020. 3. 30. 19:42

[LoginActivity.kt]

 

- 구글 로그인 기능 추가

 

* 앞서 진행한 이메일 로그인의 경우는 firebase에 있는 이메일에 회원가입 및 로그인 하는 방식임.

 

* 구글 로그인(소셜 로그인)을 하는 방식은

  1. 구글 로그인을 한 후
  2. firebase를 거쳐
  3. 로그인 확인을 응답받는 방식
package com.example.hyealsinstargram

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
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.firebase.auth.FirebaseAuth
import com.google.firebase.auth.FirebaseUser
import com.google.firebase.auth.GoogleAuthProvider
import kotlinx.android.synthetic.main.activity_login.*

class LoginActivity : AppCompatActivity() {
    var auth : FirebaseAuth? = null
    var googleSignInClient: GoogleSignInClient? =null
    var GOOGLE_LOGIN_CODE = 9001
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_login)

        auth = FirebaseAuth.getInstance()

        email_login_button.setOnClickListener {
            signinAndSignup()
        }

        google_sign_in_button.setOnClickListener {
            googleLogin()
        }

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

        googleSignInClient = GoogleSignIn.getClient(this, gso)

    }
    fun googleLogin(){
        var signInIntent = googleSignInClient?.signInIntent
        startActivityForResult(signInIntent, GOOGLE_LOGIN_CODE)
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if(requestCode==GOOGLE_LOGIN_CODE){
            var result = Auth.GoogleSignInApi.getSignInResultFromIntent(data)
            if(result.isSuccess){
                var account = result.signInAccount
                firebaseAuthWithGoogle(account)
            }
        }
    }

    fun firebaseAuthWithGoogle(account:GoogleSignInAccount?){
        var credential = GoogleAuthProvider.getCredential(account?.idToken, null)
        auth?.signInWithCredential(credential)
            ?.addOnCompleteListener {
                    task ->
                if(task.isSuccessful){
                    // Login
                    moveMainPage(task.result?.user)
                }else{
                    // Show the error message
                    Toast.makeText(this, task.exception!!.message, Toast.LENGTH_LONG).show()
                }
            }
    }

    fun signinAndSignup(){
        auth?.createUserWithEmailAndPassword(email_edittext.text.toString(), password_edittext.text.toString())
            ?.addOnCompleteListener {
            task ->
                if(task.isSuccessful){
                    // Creating a user account
                    moveMainPage(task.result?.user)
                }else if(task.exception?.message.isNullOrEmpty()){
                    // Show the error message
                    Toast.makeText(this, task.exception!!.message, Toast.LENGTH_LONG).show()
                }else{
                    // Login if you have account
                    signinEmail()
                }
        }
    }
    fun signinEmail(){
        auth?.signInWithEmailAndPassword(email_edittext.text.toString(), password_edittext.text.toString())
            ?.addOnCompleteListener {
                    task ->
                if(task.isSuccessful){
                    // Login
                    moveMainPage(task.result?.user)
                }else{
                    // Show the error message
                    Toast.makeText(this, task.exception!!.message, Toast.LENGTH_LONG).show()
                }
            }
    }
    fun moveMainPage(user:FirebaseUser?){
        if(user!=null){
            startActivity(Intent(this, MainActivity::class.java))
        }
    }
}

 


[1] 구글 로그인 하기

 

- gso 객체

 

1. 사용자 ID와 프로필 정보를 요청하기 위해서 GoogleSignInOptions 객체DEFAULT_SIGN_IN 인자와 함께 생성함


- googleSiginInClient 객체

 

2. gso객체를 인자로 전달해서  GoogleSignInClient객체생성함


- google_sign_in_button 버튼

 

3. 버튼을 눌렀을 때 googleLogin메소드가 실행되도록 함


- googleLogin 메소드

 

4. gso객체를 인자로 넘겨서 생성한 googleSignInClient 객체 signInIntent 메소드를 사용해서 Intent를 만듦


5. 만들어진 IntentstartActivityForResult 객체에 전달함(여기서 GOOGLE_LOGIN_CODE는 request코드임) → 사용자에게 인증을 요청하는 엑티비티(화면)가 실행됨


[2] firebase를 거치는 과정

 

- 사용자가 SignIn에 성공하면 onActivityResult가 실행됨

 

* 여기서 requestCode는 앞서 작성한 startActivityForResult두 번째 인자값

 

  1. 사용자가 엑티비티에서 실행한 결과 onActivityResult에서 data로 받을 수 있음
  2. result에 구글에 로그인(실행한 것) 했을 때 구글에서 넘겨주는 결과값(실행한 결과)를 받아와서 저장해줌
  3. result가 성공했을 때 이 값을 firebase에 넘겨주기 위해 account에 result의 signInAccount값을 저장한 후
  4. firebaseAuthWithGoogleaccount값을 전달함

 

- firebaseAuthWithGoogle 메소드

 

  1. 사용자가 성공적으로 로그인 했을 때 account(GoogleSignInAccount 객체)에서 ID토큰을 가져와서 firebase 사용자 인증정보로 교환함 
  2. signInWithCredential 메소드를 통해서 firebase에 인증
  3. auth 결과값을 확인하는 부분은 앞서 이메일을 확인하는 부분과 같음

프로젝트를 실행해서 구글 버튼을 누르면

 

firebase에 다음과 같이 계정이 추가됨

Comments