본문 바로가기

안드로이드 스튜디오

[안드로이드 스튜디오 코틀린] Firebase 이메일/ 비밀번호로 로그인하기

728x90
반응형

 

예전에 한 번 했었는데 이번 개인 프로젝트로 다시 만들며 정리해 보려고 글을 작성하게 되었다.

 

 

Firebase 설정부터 코드까지 한 번에 정리해보려고 한다.

 

 

 

 

 

 

 

 

 

 

우선 빈 프로젝트를 만든다.

 

 

 

 

 

 

 

 

그리고 Firebase에 들어간다.

 

 

 

 

 

 

https://firebase.google.com/?hl=ko 

 

Firebase

Firebase는 고품질 앱을 빠르게 개발하고 비즈니스를 성장시키는 데 도움이 되는 Google의 모바일 플랫폼입니다.

firebase.google.com

 

 

 

 

 

 

 

 

 

 

 

 

위 사이트에 들어가서 시작하기 버튼을 눌러준다.

 

 

 

 

 

 

 

 

 

프로젝트 추가를 눌러준다.

 

 

 

 

 

 

 

 

 

 

 

 

 

프로젝트 이름을 입력한다.

 

 

 

 

나는 이와 같이 만들었다.  계속을 눌러준다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

계속을 눌러준다

 

 

 

 

 

 

 

 

프로젝트 만들기를 눌러준다.

 

 

 

 

 

 

 

계속을 눌러준다.

 

 

 

 

 

 

 

 

 

 

새로운 프로젝트에 대한 콘솔이 생긴다.

 

 

 

 

그다음은 윗 사진에 보이는 안드로이드 모양을 클릭하여 앱을 추가해 준다.

 

 

 

 

 

 

 

 

 

 

 

 

Android 패키지 이름에는 

 

 

 

맨 처음 빈 프로젝트를 생성한 패키지 이름을 확인하여 넣어주면 된다.

 

 

 

 

 

 

 

앱 닉네임은 각자 넣어주시면 됩니다.

 

 

 

 

 

 

 

 

디버그 서명 인증서 SHA-1을 넣는 방법은

 

 

 

(일단, 저는 맥북을 사용하고 있습니다)

 

 

 

 

1. 터미널 창에서 각자 만든 프로젝트(제 프로젝트 명은 FirebaseLogin입니다)로 진입합니다. (중요)

 

cd FirebaseLogin

 

 

 

2. 프로젝트로 진입한 뒤, 다음을 입력합니다.

 

./gradlew signingReport

 

 

그럼 다음과 같이

 

아래는 개인 정보라 잘랐습니다.

 

 

이렇게 SHA1이 뜨니 등록하시면 됩니다.

 

 

 

 

 

 

위를 다 입력하고 앱 등록을 누르면

 

 

 

google-services.json을 다운로드할 수 있습니다.

다운로드하여 주세요.

 

 

 

 

Android 옆 화살표를 눌러 Project로 바꿔줍니다.

 

 

 

 

 

 

프로젝트 폴더를 보면 app에다가 넣어 주면 됩니다.

 

 

 

이 위치에 들어가야 하기 때문입니다.

 

 

 

 

 

 

 

 

 

 

 

 

이렇게 넣으시면 됩니다.

 

 

파일을 잘 넣어주고 다음을 눌러줍니다.

 

 

 

 

 

 

Firebase SDK를 추가해 줍니다.

 

 

 

 

 

 

 

 

build.gradle(Project)에 아래와 같이 추가합니다.

 

buildscript {
    repositories {
        google()
        mavenCentral()
    }
    dependencies {
        // Add the dependency for the Google services Gradle plugin
        classpath 'com.google.gms:google-services:4.3.15'
    }
}

// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
    id 'com.android.application' version '7.3.0' apply false
    id 'com.android.library' version '7.3.0' apply false
    id 'org.jetbrains.kotlin.android' version '1.7.10' apply false
}

이렇게 추가하는 건 

 

https://mimisongsong.tistory.com/63 이 글 한 번 보고 오시면 됩니다.

 

Sync Now 눌러줍니다.

 

 

 

 

 

 

 

 

build.gradle(Module)에서는 

 

 

 

이렇게 추가하라고 나와있습니다. 

 

여기서 구글 Auth를 추가해야 하기 때문에,

 

implementation 'com.google.firebase:firebase-auth-ktx'

이렇게 한 줄 더 추가해서 Sync Now 해주세요.

 

 

 

 

설정이 끝났습니다. 콘솔로 이동해 봅시다.

 

 

 

 

 

 

 

 

사용자 관리를 하는 곳으로 들어가기 위해 빌드 -> Authentication으로 들어갑니다.

 

 

시작하기 눌러주세요.

 

 

 

 

 

 

 

 

첫 번째 로그인 방법을 이메일/비밀번호를 눌러줍니다.

 

 

 

 

 

 

 

 

 

사용 설정을 해주고 저장해 줍니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

이렇게 이메일/비밀번호를 사용하여 설정을 해줍니다.

 

 

 

 

 

EmptyActivity 생성을 해주고, LoginActivity로 이름을 지어줍니다.

 

 

 

 

 

 

 

viewBinding 사용을 위해 추가해 줍니다.

 

 

 

 

그리고 activity_login.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=".LoginActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="100dp"
        android:text="로그인"
        android:textSize="30sp"
        android:textStyle="italic"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <LinearLayout
        android:id="@+id/idLL"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="250dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginEnd="12.5dp"
            android:text="아이디 : " />

        <EditText
            android:id="@+id/idET"
            android:layout_width="250dp"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:hint="abcd@example.com" />

    </LinearLayout>

    <LinearLayout
        android:id="@+id/passwordLL"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/idLL">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="비밀번호 : " />

        <EditText
            android:id="@+id/passwordET"
            android:layout_width="250dp"
            android:layout_height="wrap_content"
            android:gravity="center" />

    </LinearLayout>

    <Button
        android:id="@+id/loginButton"
        android:layout_width="270dp"
        android:layout_height="60dp"
        android:layout_marginTop="60dp"
        android:text="로그인"
        android:textStyle="bold"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/passwordLL" />

</androidx.constraintlayout.widget.ConstraintLayout>

 

 

 

 

 

이렇게 간단한 화면으로 구성하였습니다.

 

 

 

 

 

 

 

 

 

 

 

이제 코드를 입력해 봅시다.

 

https://firebase.google.com/docs/auth/android/start?hl=ko 

 

Android에서 Firebase 인증 시작하기

Firebase Summit에서 발표된 모든 내용을 살펴보고 Firebase로 앱을 빠르게 개발하고 안심하고 앱을 실행하는 방법을 알아보세요. 자세히 알아보기 의견 보내기 Android에서 Firebase 인증 시작하기 컬렉션

firebase.google.com

 

공식 사이트에 자세하게 나와있습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

LoginActivity.kt

 

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast
import com.example.firebaselogin.databinding.ActivityLoginBinding
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.auth.ktx.auth
import com.google.firebase.ktx.Firebase

class LoginActivity : AppCompatActivity() {

    private lateinit var binding: ActivityLoginBinding
    private lateinit var auth: FirebaseAuth

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityLoginBinding.inflate(layoutInflater)
        setContentView(binding.root)

        // Firebase 초기화
        auth = Firebase.auth

        binding.loginButton.setOnClickListener {
            val email = binding.idET.text.toString()
            val password = binding.passwordET.text.toString()

            auth.createUserWithEmailAndPassword(email, password).addOnCompleteListener { result ->
                if (result.isSuccessful) {
                    Toast.makeText(this, "회원가입이 완료되었습니다.", Toast.LENGTH_SHORT).show()
                    if (auth.currentUser != null) {
                        goToMainActivity()
                    }
                } else {
                    signIn(email, password)
                }
            }
        }
    }

    override fun onStart() {
        super.onStart()

        // User가 로그인을 했는지 안했는지 확인해주는 로직으로, Activity와 Fragment가 활성화가 되기 전에 실행되어야 하므로 onStart에서 체크해줌
        val currentUser = auth.currentUser
        if (currentUser != null) {

        }
    }

    private fun signIn(email: String, password: String) {
        auth.signInWithEmailAndPassword(email, password).addOnCompleteListener { task ->
            if (task.isSuccessful) {
                goToMainActivity()
            } else {
                Toast.makeText(this, "로그인을 다시 시도해주세요", Toast.LENGTH_SHORT).show()
            }
        }
    }
    
    private fun goToMainActivity() {
        startActivity(MainActivity.getIntent(this))
    }
    
}

 

 

 

 

 

 

 

 

MainActivity.kt

 

 

import android.content.Context
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.example.firebaselogin.databinding.ActivityMainBinding
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.auth.ktx.auth
import com.google.firebase.ktx.Firebase

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding
    private lateinit var auth: FirebaseAuth

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        auth = Firebase.auth

        binding.mainTV.text = "${auth.currentUser?.email} 님이 로그인 하였습니다."
    }

    companion object {
        fun getIntent(context: Context) : Intent {
            val intent = Intent(context, MainActivity::class.java)
            return intent
        }
    }
}

 

 

 

 

 

이렇게 코드를 입력하고 빌드를 해줍니다

 

 

 

 

 

 

 

 

이렇게 아이디와 비밀번호를 입력하면

 

 

 

 

 

 

 

메인 화면에서 현재 유저의 이메일을 알 수 있습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Authentication에서 확인하면 새로운 유저가 생긴 걸 볼 수 있습니다.

 

 

 

 

 

 

끝~~~~~~~~~

 

 

 

 

 

 

 

 

 

 

 

 

 

 

혹시..........

 

 

 

 

 

 

 

 

위와 똑같이 따라 했는데, signIn 함수 내에 있는 "로그인을 다시 시도해 주세요" 토스트가 계속 뜨시는 분 계신가요?

 

(아니라면 안 보셔도 됩니다!)

 

 

 

 

 

 

 

자, 아래 두 가지가 실패의 예입니다.

 

 

숫자여서 에러가 나는 것인가? -> 아닙니다. 문자로 바꿔도 같은 토스트가 반복해서 나왔습니다.

 

분명 다른 프로젝트를 진행하면서 코드 상의 차이점은 발견하지 못하였습니다.

 

 

 

 

 

 

 

 

 

에러 로그를 발견하여 구글링을 했습니다!! 

 

 

 

 

 

 

 

 

 

에러는 Ignoring header X-Firebase-Locale because its value was null.라고 나왔습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

원인은...!!!!!!

 

 

이것입니다. 

 

 

 

"Password must be at least 6 characters"

 

 

 

비밀번호가 6자리 이상이어야 하네요! 

 

 

 

 

 

 

 

 

그래서 1234에서 회원 가입이 되지 않던 비밀번호가 123456789에서는 성공했던 것입니다.

 

 

 

 

 

 

 

자세한 글은 아래를 참고하세요!

 

https://stackoverflow.com/questions/64727665/w-system-ignoring-header-x-firebase-locale-because-its-value-was-null

 

W/System: Ignoring header X-Firebase-Locale because its value was null

Im very new to android studio. I'm trying to make a signup page with email and password authentication with Firebase. Howerver, whenever I try to click the sign up button it gives: W/System: Ignor...

stackoverflow.com

 

 

 

휴.. 진짜 끝!!!!!!!!!!!!! 1

 

 

 

 

 

 

 

 

 

 

 

 

 

전체 코드는 

 

아래 주소에서 확인하세요

(google-service.json 파일 자세한 정보를  지우고 올렸음)

 

https://github.com/songmik/FirebaseLogin

 

GitHub - songmik/FirebaseLogin

Contribute to songmik/FirebaseLogin development by creating an account on GitHub.

github.com

 

 

 

 

 

 

 

 

긴 글 봐주셔서 감사합니다! 

728x90
반응형