hyeals study
인스타그램 클론 (구글 로그인) 본문
[LoginActivity.kt]
- 구글 로그인 기능 추가
* 앞서 진행한 이메일 로그인의 경우는 firebase에 있는 이메일에 회원가입 및 로그인 하는 방식임.
* 구글 로그인(소셜 로그인)을 하는 방식은
- 구글 로그인을 한 후
- firebase를 거쳐
- 로그인 확인을 응답받는 방식
package com.example.hyealsinstargram
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() {
var auth : FirebaseAuth? = null
var googleSignInClient: GoogleSignInClient? =null
var GOOGLE_LOGIN_CODE = 9001
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()
}
var gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id))
.requestEmail()
.build()
googleSignInClient = GoogleSignIn.getClient(this, gso)
}
fun googleLogin(){
var signInIntent = googleSignInClient?.signInIntent
startActivityForResult(signInIntent, GOOGLE_LOGIN_CODE)
}
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)
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] 구글 로그인 하기
- gso 객체
1. 사용자 ID와 프로필 정보를 요청하기 위해서 GoogleSignInOptions 객체를 DEFAULT_SIGN_IN 인자와 함께 생성함
- googleSiginInClient 객체
2. gso객체를 인자로 전달해서 GoogleSignInClient객체를 생성함
- google_sign_in_button 버튼
3. 버튼을 눌렀을 때 googleLogin메소드가 실행되도록 함
- googleLogin 메소드
4. gso객체를 인자로 넘겨서 생성한 googleSignInClient 객체의 signInIntent 메소드를 사용해서 Intent를 만듦
5. 만들어진 Intent를 startActivityForResult 객체에 전달함(여기서 GOOGLE_LOGIN_CODE는 request코드임) → 사용자에게 인증을 요청하는 엑티비티(화면)가 실행됨
[2] firebase를 거치는 과정
- 사용자가 SignIn에 성공하면 onActivityResult가 실행됨
* 여기서 requestCode는 앞서 작성한 startActivityForResult의 두 번째 인자값임
- 사용자가 엑티비티에서 실행한 결과를 onActivityResult에서 data로 받을 수 있음
- result에 구글에 로그인(실행한 것) 했을 때 구글에서 넘겨주는 결과값(실행한 결과)를 받아와서 저장해줌
- result가 성공했을 때 이 값을 firebase에 넘겨주기 위해 account에 result의 signInAccount값을 저장한 후
- firebaseAuthWithGoogle에 account값을 전달함
- firebaseAuthWithGoogle 메소드
- 사용자가 성공적으로 로그인 했을 때 account(GoogleSignInAccount 객체)에서 ID토큰을 가져와서 firebase 사용자 인증정보로 교환함
- signInWithCredential 메소드를 통해서 firebase에 인증함
- auth 결과값을 확인하는 부분은 앞서 이메일을 확인하는 부분과 같음
프로젝트를 실행해서 구글 버튼을 누르면
firebase에 다음과 같이 계정이 추가됨
'안드로이드' 카테고리의 다른 글
인스타그램 클론 (사진 업로드) (0) | 2020.04.01 |
---|---|
인스타그램 클론 (메인 화면) (0) | 2020.03.31 |
인스타그램 클론 (페이스북 로그인) (1) | 2020.03.31 |
인스타그램 클론 (회원가입 및 로그인 기능) (0) | 2020.03.30 |
인스타그램 클론 (로그인 화면) (0) | 2020.03.29 |