구글 소셜 로그인/회원가입 부분은 이미 다른 팀원이 소스코드를 작성해 놓은 상태이다.
FCM Device Token
기기별로 고유한 token을 부여받고, 이 토큰을 통해 해당 기기에게 알림을 보내게 된다.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mAuth = FirebaseAuth.getInstance()
initFirebaseAuth()
initValues()
}
private fun initFirebaseAuth() {
val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(FIREBASE_CLIENT_KEY)
.requestEmail()
.build()
mGoogleApiClient = GoogleApiClient.Builder(this)
.enableAutoManage(this){}
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build()
mAuthListener = FirebaseAuth.AuthStateListener() { updateProfile() }
}
// onActivityResult 를 실행한다.
private fun firbaseSignIn() {
val signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient)
startActivityForResult(signInIntent, RC_SIGN_IN)
}
initFirebaseAuth 는 Google api를 이용해서 사용자의 로그인 상태를 확인하고 파이어 베이스 디바이스 Token을 받아오기 위한 GoogleSignOption을 초기화 하는 부분이다.
아래 코드에서는 requestCode ==RC_SIGN_IN 부분을 확인하면 된다.
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if(requestCode == G_SIGN_IN){ //구글 로그인 / 회원가입 gso 확인
if(resultCode!=0){
val task: Task<GoogleSignInAccount> = GoogleSignIn.getSignedInAccountFromIntent(data)
val account = task.getResult(ApiException::class.java)
email = account?.email.toString()
authService.setLoginView(this)
authService.login(UserEmail(email))
}
}else if(requestCode ==RC_SIGN_IN){ //파이어베이스 토큰을 얻기 위한 gso 확인
val result = Auth.GoogleSignInApi.getSignInResultFromIntent(data!!)!!
if( result.isSuccess) {
email =result.signInAccount?.email!!
firebaseAuthWithGoogle(result.signInAccount)
updateProfile()
}
}
}
//계정의 권한을 확인하고 인증 결과를 넘긴다.
fun firebaseAuthWithGoogle(account : GoogleSignInAccount?){
var credential = GoogleAuthProvider.getCredential(account?.idToken,null)
mAuth?.signInWithCredential(credential)
?.addOnCompleteListener{
task ->
if(task.isSuccessful){
// 아이디, 비밀번호 맞을 때
updateProfile()
moveMainPage(task.result?.user)
}else{
// 틀렸을 때
Log.e("Firebase",task.exception?.message.toString())
}
}
}
fun updateProfile(){
mAuth = FirebaseAuth.getInstance()
val user = mAuth?.currentUser
if(user != null) {
FirebaseMessaging.getInstance().token.addOnCompleteListener(OnCompleteListener {
task-> if(!task.isSuccessful){
Log.w(ApplicationClass.TAG,"FetchingFCM registration token failed", task.exception)
return@OnCompleteListener
}
val token = task.result
val msg = getString(R.string.msg_token_fmt, token)
fcmTokenService.setFcmTokenView(this)
fcmTokenService.postFcmToken(getUserIdx(),token) //서버로 Token 전송
})
}
}
디바이스 토큰을 관리하는 방법은 초기에는 파이어베이스의 Realtime Database를 사용하는 방법을 채택했었다. 하지만 프로젝트 구조상 DB를 따로 또 사용하기보다 Server의 User DB에 Column을 추가하여 관리하는 방법으로 변경하면서 Realtime DB에 저장하는 코드를 서버로 전송하는 방법으로 수정하였다.
하지만!!
Realtime DB를 사용하는 방법이 궁금하실 수 있으니 그 부분도 함께 공유해보고자 한다.
다음 포스팅을 참고해 주세요! 😎
부가적인 코드는 이렇다!
//파이어베이스 자동 로그인 처리
fun moveMainPage(user: FirebaseUser?){
if( user!= null){
startActivity(Intent(this, MainActivity::class.java))
finish()
}else{
firbaseSignIn()
}
}
override fun onPause() {
super.onPause()
mGoogleApiClient.stopAutoManage(this);
mGoogleApiClient.disconnect();
}
이 모든 과정이 끝나면
Authentication 페이지에 요렇게 로그인된 모습을 볼 수 있을 것이다!!
자, 이제 token이 제대로 발급 받아 졌는지 간단한 test를 해보려고 한다.
1.발급 부분에 로그를 하나 찍어서 확인한다!, 그리고 복사해서
테스트 메시지 전송에서 아까 발급받은 토큰을 넣어 줍니다.
뾰로로롱
이렇게 알람이 온 걸 확인할 수 있다!!!