Firebase Authentication

Hwan·2023년 6월 29일
0

GiftMap

목록 보기
14/15

구현할 내용

  • 사용자 별 정보를 나누기 위해 '회원가입/로그인' 기능 추가
  • 로그인 한 전적이 있다면 자동 로그인

로그아웃, 회원탈퇴는 추후 생각

storage/DB를 연결했던 것과 동일하게, 코드를 작성하기 전 Firebase에서 Authentication을 생성하고 android studio에서 연동시켜주는 절차가 필요함


1. activity_main.xml

원래는 지도를 Main에 두었으나, 해당 코드들은 모두 MapActivity.kt와 activity_map.xml에 옮겼음.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/idET"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textEmailAddress"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        android:layout_marginBottom="80dp"/>

    <EditText
        android:id="@+id/pwET"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textPassword"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@id/idET" />

    <TextView
        android:id="@+id/idView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Email"
        app:layout_constraintRight_toLeftOf="@id/idET"
        app:layout_constraintTop_toTopOf="@id/idET"
        app:layout_constraintBottom_toBottomOf="@id/idET"
        android:layout_marginRight="10dp"
        />

    <TextView
        android:id="@+id/pwView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="PW"
        app:layout_constraintRight_toLeftOf="@id/pwET"
        app:layout_constraintTop_toTopOf="@id/pwET"
        app:layout_constraintBottom_toBottomOf="@id/pwET"
        android:layout_marginRight="10dp"
        />

    <Button
        android:id="@+id/joinBTN"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="onClick"
        android:text="회원가입"
        app:layout_constraintTop_toBottomOf="@id/pwET"
        app:layout_constraintLeft_toLeftOf="@id/pwET"
        android:layout_marginTop="20dp"
        />

    <Button
        android:id="@+id/loginBTN"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="onClick"
        android:text="로그인"
        app:layout_constraintTop_toBottomOf="@id/pwET"
        app:layout_constraintRight_toRightOf="@id/pwET"
        android:layout_marginTop="20dp"/>

</androidx.constraintlayout.widget.ConstraintLayout>

2. MainActivity.kt

class MainActivity : AppCompatActivity() {

    lateinit var auth: FirebaseAuth
    lateinit var email: String
    lateinit var password: String

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        auth = FirebaseAuth.getInstance()
        var joinBTN: Button = findViewById(R.id.joinBTN)
        var loginBTN: Button = findViewById(R.id.loginBTN)
        var idET: EditText = findViewById(R.id.idET)
        var pwET: EditText = findViewById(R.id.pwET)

        loginBTN.setOnClickListener{
            email = idET.text.toString()
            password = pwET.text.toString()
            auth.signInWithEmailAndPassword(email,password) // 로그인
                .addOnCompleteListener {
                        result->
                    if(result.isSuccessful){
                        var intent = Intent(this, MainActivity::class.java)
                        startActivity(intent)
                    } else {
                        Toast.makeText(this, "로그인 실패", Toast.LENGTH_LONG).show()
                }
            }
        }
        joinBTN.setOnClickListener{
            email = idET.text.toString()
            password = pwET.text.toString()
            auth.createUserWithEmailAndPassword(email,password) // 회원 가입
                .addOnCompleteListener {
                        result ->
                    if(result.isSuccessful){
                        Toast.makeText(this,"회원가입 완료",Toast.LENGTH_SHORT).show()
                        if(auth.currentUser!=null){
                            var intent = Intent(this, MapActivity::class.java)
                            startActivity(intent)
                            finish()
                        }
                    }
                    else if(result.exception?.message.isNullOrEmpty()){
                        Toast.makeText(this, "회원가입 실패", Toast.LENGTH_LONG).show()
                    }
                }
        }
    }

    override fun onStart() {
        super.onStart()
        val currentUser = auth!!.currentUser
        updateUI(currentUser)
    }

    // 로그인 감지
    private fun updateUI(currentUser: FirebaseUser?) {
        if (currentUser != null) {
            val intent: Intent = Intent(this, MapActivity::class.java)
            startActivity(intent)
            finish()
        }
    }
}

0개의 댓글