관리 메뉴

hyeals study

인스타그램 클론 (페이스북 로그인) 본문

안드로이드

인스타그램 클론 (페이스북 로그인)

hyeals 2020. 3. 31. 13:17

[LoginActivity.kt]

 

- 페이스북 로그인도 구글로그인과 마찬가지로 3단계로 구성됨

  1. 페이스북 로그인
  2. firebase 인증을 거쳐
  3. 로그인 확인을 응답 받음

- facebook for developers에 접속해서 로그인을 한 뒤 새로운 앱을 만듦(https://developers.facebook.com/?locale=ko_KR)

- 대시보드에서 facebook Login에서 설정을 눌러서 나오는 내용을 안드로이드 스튜디오에 설정

 

- 이 과정을 끝내면 firebase에서 facebook사용을 허용하도록 해야함

  1. firebase에서 fackbook사용을 허용하고
  2. firebase의 리디렉션을 facebook for developer에 만든 앱의 facebook Login settings의 리디렉션에 입력함
  3. facebook for developer에 있는 settings에 들어가서 앱 ID와 앱 시크릿 값을 얻어와서 firebase에 입력

 

package com.example.hyealsinstargram

import android.content.Intent
import android.content.pm.PackageManager
import android.os.Bundle
import android.telecom.Call
import android.util.Base64
import android.util.Log
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.FragmentActivity
import com.facebook.AccessToken
import com.facebook.CallbackManager
import com.facebook.FacebookCallback
import com.facebook.FacebookException
import com.facebook.login.LoginManager
import com.facebook.login.LoginResult
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.*
import kotlinx.android.synthetic.main.activity_login.*
import java.security.MessageDigest
import java.security.NoSuchAlgorithmException
import java.util.*


class LoginActivity : AppCompatActivity() {
    var auth : FirebaseAuth? = null
    var googleSignInClient: GoogleSignInClient? =null
    var GOOGLE_LOGIN_CODE = 9001
    var callbackManager: CallbackManager? = null
    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()
        }

        facebook_login_button.setOnClickListener {
            facebookLogin()
        }

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

        googleSignInClient = GoogleSignIn.getClient(this, gso)
        //printHashKey()

        callbackManager = CallbackManager.Factory.create()

    }

    fun printHashKey() {
        try {
            val info = packageManager.getPackageInfo(packageName, PackageManager.GET_SIGNATURES)
            for (signature in info.signatures) {
                val md = MessageDigest.getInstance("SHA")
                md.update(signature.toByteArray())
                val hashKey = String(Base64.encode(md.digest(), 0))
                Log.i("TAG", "printHashKey() Hash Key: $hashKey")
            }
        } catch (e: NoSuchAlgorithmException) {
            Log.e("TAG", "printHashKey()", e)
        } catch (e: Exception) {
            Log.e("TAG", "printHashKey()", e)
        }
    }
    fun googleLogin(){
        var signInIntent = googleSignInClient?.signInIntent
        startActivityForResult(signInIntent, GOOGLE_LOGIN_CODE)
    }

    fun facebookLogin(){
        LoginManager.getInstance()
            .logInWithReadPermissions(this, Arrays.asList("public_profile","email"))

        LoginManager.getInstance()
            .registerCallback(callbackManager, object: FacebookCallback<LoginResult>{
                override fun onSuccess(result: LoginResult?) {
                    handleFackbookAccessToken(result?.accessToken)
                }

                override fun onCancel() {

                }

                override fun onError(error: FacebookException?) {
                    
                }

            })
    }

    fun handleFackbookAccessToken(token: AccessToken?){
        var credental = FacebookAuthProvider.getCredential(token?.token!!)
        auth?.signInWithCredential(credental)
            ?.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()
                }
            }
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        callbackManager?.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] 페이스북 로그인 하기

 

- callbackManager 객체: 페이스북 로그인 결과를 가져오는 객체


- CallbackManager.Factory.create()를 호출해서 로그인을 응답을 처리할 콜백 관리자를 만듦


- onActivityResult 메소드(콜백 함수)callbackManager.onActivityResult를 호출해서 로그인의 결과callbackManager를 통해 LoginManager에게 전달함


- facebookLogin 메소드

 

  1. LoginManager를 이용해서 페이스북에서 받을 권한을 요청함. 여기에서는 public_profileemail을 요청함
  2. 그 다음 object: FacebookCallback<LoginResult>는 최종적으로 로그인에 성공했을 때 나오는 부분임
  3. onSuccess메소드: 로그인에 성공했을 때 실행되는 메소드 

[2] firebase 인증 

 

 

- handleFackbookAccessToken 메소드: 페이스북 데이터를 firebase에 넘기는 기능

 

구글 로그인과 동일하게 firebase에 인증 확인을 받으면 됨.


마지막으로 이 모든 과정을 페이스북 버튼을 누르면 실행되도록 함.


- 프로젝트를 실행해서 페이스북 버튼을 누르면 페이스북 로그인 화면이 띄워짐

 

- 페이스북으로 로그인 하게 되면 다음 엑티비티로 넘어가게 되고, firebase에 아래와 같이 페이스북 계정이 추가됨

 

페이스북 로그인 완료

 

Comments