예전에 한 번 했었는데 이번 개인 프로젝트로 다시 만들며 정리해 보려고 글을 작성하게 되었다.
Firebase 설정부터 코드까지 한 번에 정리해보려고 한다.
우선 빈 프로젝트를 만든다.
그리고 Firebase에 들어간다.
https://firebase.google.com/?hl=ko
위 사이트에 들어가서 시작하기 버튼을 눌러준다.
프로젝트 추가를 눌러준다.
프로젝트 이름을 입력한다.
나는 이와 같이 만들었다. 계속을 눌러준다.
계속을 눌러준다
프로젝트 만들기를 눌러준다.
계속을 눌러준다.
새로운 프로젝트에 대한 콘솔이 생긴다.
그다음은 윗 사진에 보이는 안드로이드 모양을 클릭하여 앱을 추가해 준다.
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
공식 사이트에 자세하게 나와있습니다.
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에서는 성공했던 것입니다.
자세한 글은 아래를 참고하세요!
휴.. 진짜 끝!!!!!!!!!!!!! 1
전체 코드는
아래 주소에서 확인하세요
(google-service.json 파일 자세한 정보를 지우고 올렸음)
https://github.com/songmik/FirebaseLogin
긴 글 봐주셔서 감사합니다!