이번 포스팅에서는 카카오톡 로그인 구현을 위해 작성. 로그인까지는 성공하고 로그인 한 사람의 데이터 불러오는 데까지는 성공했는데, 그 다음 파이어베이스에 그 정보를 넣는 것을 아직 구현하지 못한 상태다.
import com.kakao.sdk.common.KakaoSdk
import com.kakao.sdk.user.UserApiClient
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityLoginBinding.inflate(layoutInflater)
setContentView(binding.root)
KakaoSdk.init(this, "appkey")
카카오톡 로그인에는 kakao developers를 참조해서 작성하였다.
호출 시 context와 결과 처리를 위한 콜백(Callback)함수 전달.
// 토큰 정보 보기
UserApiClient.instance.accessTokenInfo { tokenInfo, error ->
if (error != null) {
Log.e(TAG, "토큰 정보 보기 실패", error)
}
else if (tokenInfo != null) {
Log.i(TAG, "토큰 정보 보기 성공" +
"\n회원번호: ${tokenInfo.id}" +
"\n만료시간: ${tokenInfo.expiresIn} 초")
}
}
로그인에 성공했다면 정보가 제대로 출력이 될 것.
// 카카오톡으로 로그인
UserApiClient.instance.loginWithKakaoTalk(context) { token, error ->
if (error != null) {
Log.e(TAG, "로그인 실패", error)
}
else if (token != null) {
Log.i(TAG, "로그인 성공 ${token.accessToken}")
}
}
카카오톡 로그인 버튼을 누르면 커스텀 토큰을 생성하고, 파이어베이스에 등록되는 걸 구현하고 싶었다. 그런데 커스텀 토큰은 생성되는 것 같고, 그 다음 파이어베이스에 들어가는 작업이 잘 실행되지 않는다. 왜일까
binding.buttonKakaoLogin.setOnClickListener {
FirebaseApp.initializeApp(baseContext)
//카카오톡 로그인 진행
if(UserApiClient.instance.isKakaoTalkLoginAvailable(this)){
UserApiClient.instance.loginWithKakaoTalk(this){ token, error ->
if(error != null){
} else if(token != null){
getFirebaseJwt(token.accessToken, LOGIN_KAKAO)!!.continueWithTask() { task ->
val firebaseToken = task.result
Log.d("newToken", firebaseToken)
val auth = FirebaseAuth.getInstance()
Log.d("uid", auth.uid.toString())
firebaseToken?.let{
auth.signInWithCustomToken(it).addOnCompleteListener(this){ task ->
if(task.isSuccessful){
FirebaseMessaging.getInstance().token.addOnCompleteListener(OnCompleteListener { task ->
if (!task.isSuccessful) {
Log.w(TAG, "getInstanceId failed", task.exception)
return@OnCompleteListener
}
val user: FirebaseUser? = fsAuth?.getCurrentUser()
val fireStoreDocument: String?
fireStoreDocument = if (user?.email != null) {
user.email
} else {
user?.uid
}
val token: String = task.getResult()
Log.d("nextToken", token)
val data: MutableMap<String, Any> = java.util.HashMap()
data["token"] = token
FirebaseFirestore.getInstance().collection("Tokens")
.document(fireStoreDocument!!)
.set(data)
.addOnSuccessListener {
Log.d(TAG, "add token to DB Success!")
finish()
}
.addOnFailureListener {
Log.d(
TAG,
"add token to DB failed..."
)
}
})
} else {
}
}
}
}.addOnCompleteListener(OnCompleteListener { task ->
if (task.isSuccessful) {
} else {
Toast.makeText(applicationContext, "커스텀 토큰 부분 실패.", Toast.LENGTH_LONG)
.show()
if (task.exception != null) {
Log.e(TAG, "커스텀 토큰 에러")
Log.e(TAG, task.exception.toString())
}
}
})
}
}
} else{
UserApiClient.instance.loginWithKakaoAccount(this, callback = callback)
}
}