2021.04.11 - [안드로이드 스튜디오/기본] - [Android Studio] 파이어베이스 연결 후 로그인 구현하기
우선 파이어베이스에 연결되어 있지 않다면 파이어베이스에 연결해야 한다.
firebase.google.com/docs/auth/android/google-signin?hl=ko
파이어베이스 공식문서를 참고하였다.
구글 로그인 구현하기
private var auth : FirebaseAuth? = null
auth = FirebaseAuth.getInstance()
일반 로그인과 동일하게 auth 를 선언해주고, onCreate에서 초기화해준다.
파이어베이스 콘솔에서 구글로그인을 사용설정 해준다.
implementation platform('com.google.firebase:firebase-bom:27.0.0')
implementation 'com.google.firebase:firebase-auth-ktx'
implementation 'com.google.android.gms:play-services-auth:17.0.0'
그래들에서 dependencies 추가해준다.
일반 로그인을 구현할때 위의 2개는 추가했으므로 play-services-auth만 추가하였다.
private var googleSignInClient : GoogleSignInClient? = null
private var GOOGLE_LOGIN_CODE = 9001
액티비티에서 GoogleSignInClient 와 요청코드를 작성해준다.
fun googleLogin(){
var signInIntent = googleSignInClient?.signInIntent
startActivityForResult(signInIntent,GOOGLE_LOGIN_CODE)
}
그 후 구글 로그인을 위한 함수를 작성해주고
googleButton.setOnClickListener { googleLogin() }
onCreate에서 연결해준다.
var gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id))
.requestEmail()
.build()
googleSignInClient = GoogleSignIn.getClient(this,gso)
서버의 클라이언트 ID를 requestIdToken에 저장하기 위한 코드를 작성해주고
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)!!
// 구글API가 넘겨주는 값 받아옴
if(result.isSuccess) {
var accout = result.signInAccount
firebaseAuthWithGoogle(accout)
Toast.makeText(this,"성공",Toast.LENGTH_SHORT).show()
}
else{
Toast.makeText(this,"실패",Toast.LENGTH_SHORT).show()
}
}
}
onActivityResult를 오버라이드하여 구글 API가 넘겨주는 값을 받아온다.
fun firebaseAuthWithGoogle(account : GoogleSignInAccount?){
var credential = GoogleAuthProvider.getCredential(account?.idToken,null)
auth?.signInWithCredential(credential)
?.addOnCompleteListener{
task ->
if(task.isSuccessful){
// 아이디, 비밀번호 맞을 때
moveMainPage(task.result?.user)
}else{
// 틀렸을 때
Toast.makeText(this,task.exception?.message,Toast.LENGTH_SHORT).show()
}
}
}
받아온 정보를 확인하여 맞으면 로그인시켜준다.
전체코드
package org.techtown.firebase_test
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() {
private var auth : FirebaseAuth? = null
private var googleSignInClient : GoogleSignInClient? = null
private var GOOGLE_LOGIN_CODE = 9001
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_login)
auth = FirebaseAuth.getInstance()
// 회원가입 창으로
signupButton.setOnClickListener {
startActivity(Intent(this,SignupActivity::class.java))
}
// 로그인 버튼
loginButton.setOnClickListener {
signIn(idEditText.text.toString(),passwordEditText.text.toString())
}
// 구글 로그인 버튼
googleButton.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)
}
// 로그아웃하지 않을 시 자동 로그인 , 회원가입시 바로 로그인 됨
public override fun onStart() {
super.onStart()
moveMainPage(auth?.currentUser)
}
// 로그인
private fun signIn(email: String, password: String) {
if (email.isNotEmpty() && password.isNotEmpty()) {
auth?.signInWithEmailAndPassword(email, password)
?.addOnCompleteListener(this) { task ->
if (task.isSuccessful) {
Toast.makeText(
baseContext, "로그인에 성공 하였습니다.",
Toast.LENGTH_SHORT
).show()
moveMainPage(auth?.currentUser)
} else {
Toast.makeText(
baseContext, "로그인에 실패 하였습니다.",
Toast.LENGTH_SHORT
).show()
}
}
}
}
// 구글 로그인 함수
fun googleLogin(){
var signInIntent = googleSignInClient?.signInIntent
startActivityForResult(signInIntent,GOOGLE_LOGIN_CODE)
}
fun firebaseAuthWithGoogle(account : GoogleSignInAccount?){
var credential = GoogleAuthProvider.getCredential(account?.idToken,null)
auth?.signInWithCredential(credential)
?.addOnCompleteListener{
task ->
if(task.isSuccessful){
// 아이디, 비밀번호 맞을 때
moveMainPage(task.result?.user)
}else{
// 틀렸을 때
Toast.makeText(this,task.exception?.message,Toast.LENGTH_SHORT).show()
}
}
}
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)!!
// 구글API가 넘겨주는 값 받아옴
if(result.isSuccess) {
var accout = result.signInAccount
firebaseAuthWithGoogle(accout)
Toast.makeText(this,"로그인 성공",Toast.LENGTH_SHORT).show()
}
else{
Toast.makeText(this,"로그인 실패",Toast.LENGTH_SHORT).show()
}
}
}
// 유저정보 넘겨주고 메인 액티비티 호출
fun moveMainPage(user: FirebaseUser?){
if( user!= null){
startActivity(Intent(this,MainActivity::class.java))
finish()
}
}
}
기능이 잘 구현된것을 확인할 수 있다.
github.com/HanYeop/AndroidStudio-Practice/tree/master/Firebase_test