시험이 끝나서 오랜만에 안드로이드 공부를 다시 시작했다. 보니까 한달정도는 지난거 같아서, 까먹은것도 많은데 블로그 그럴때 블로글 한번씩 보는 중이다. 꽤 도움이 된다. 소셜 로그인기능중 페이스북을 구현해본다. 우리나라는 이제 페이스북은 별로 안쓰는거 같고, 카카오톡이나 네이버 로그인이 더 많이 쓰일거 같다. 근데 firebase에서는 기본 베이스로는 지원하지 않기 때문에 가장 흔히 사용하는 페이스북 소셜 로그인을 구현해본다.
# 준비
먼저 페이스북 디벨로퍼에서 회원가입 한 후, 내 앱을 만든다.
간단한 로그인기능만 사용할거이기 때문에 소비자로 만들면 된다.
이후 내가 만든 앱에서 기본설정을 눌러 앱ID와 앱시크릿 코드를 복사하여
파이어 베이스의 authentication에 login-method에 페이스북을 추가 해당 값들을 복붙해준다.
그리고 다시 FaceBook(이제는 meta가 되어 버린..)으로 돌아와 저기서 하라는대로 한다. 몇개는 안해도 되는데 읽어보면서 필요한거 골라서 하면 된다.
# 기능 구현하기
## 레이아웃(XML)에 페이스북 로그인 버튼 추가
위 준비 과정을 다 맞추었다면, 내 안드로이드 스튜디오에는 페이스북과 잘 연동 돼 있을 것이다. 페이스북 로그인을 위한 버튼을 먼저 xml에 추가해주자.
<com.facebook.login.widget.LoginButton
android:id="@+id/facebookLoginButton"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/signupButton"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
LoginButton을 추가해주면 이쁘게 디자인 된 버튼이 생길 것이다.
## 액티비티에서 연동하기
먼저 우리가 사용하는 소셜로그인들은 버튼을 누르면, 새로운 페이지가 열리고 거기서 로그인 되면 다시 내 앱으로 돌아오는 형태이다. 여기서도 똑같다. 그렇게 다시 리턴을 받는 경우에는 onActivityResult를 사용한다. 그리고 그러한 것들은 페이스북내에 구현 된 callbackManger가 알아서 해준다.
### onActivityResult
private lateinit var callbackManager : CallbackManager
override fun onCreate(savedInstanceState: Bundle?) {
// ...
//페이스북 연결
callbackManager = CallbackManager.Factory.create()
// ...
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
callbackManager.onActivityResult(requestCode,resultCode,data)
}
### 로그인 버튼
이제 로그인 버튼을 누르고 나서 일련의 과정을 정의하자. 사실 이런 소셜 로그인은 이미 다 짜여있는 코드이기 때문에 딱히 복잡한 것은 없다.
private fun initFacebookLoginButton() {
val facebookLoginButton = binding.facebookLoginButton
// 어떤걸 받아올지 !
facebookLoginButton.setPermissions("email","public_profile")
facebookLoginButton.registerCallback(callbackManager,object: FacebookCallback<LoginResult>{
override fun onCancel() {
}
override fun onError(error: FacebookException) {
Toast.makeText(this@LoginActivity,"로그인에 실패했습니다",Toast.LENGTH_SHORT).show()
}
override fun onSuccess(result: LoginResult) {
val credential = FacebookAuthProvider.getCredential(result.accessToken.token)
auth.signInWithCredential(credential)
.addOnCompleteListener { task ->
if(task.isSuccessful) {
finish()
}else {
Toast.makeText(this@LoginActivity,"로그인에 실패했습니다",Toast.LENGTH_SHORT).show()
}
}
}
})
}
중요한 건 onSuccess이후 인데, credential을 로그인 시 받아오고, firebase에 받아온 credential을 통하여 로그인을 하는 것이다.
# 마치며
hash-key관련해서 이슈를 겪고 있는데 해결하면 추가적으로 수정하여 포스팅하도록 하겠다. 다시 안드로이드 공부도 열심히하고 슬슬 알고리즘 공부도 해야겠다.