[Kotlin] 카카오톡 로그인 (미완)

호우·2022년 7월 27일
0

코틀린

목록 보기
5/8

이번 포스팅에서는 카카오톡 로그인 구현을 위해 작성. 로그인까지는 성공하고 로그인 한 사람의 데이터 불러오는 데까지는 성공했는데, 그 다음 파이어베이스에 그 정보를 넣는 것을 아직 구현하지 못한 상태다.

카카오톡 API구현 위한 기본 세팅

  • 카카오톡 SDK를 위해 import
import com.kakao.sdk.common.KakaoSdk
import com.kakao.sdk.user.UserApiClient
  • kakao의 kakao_native_key를 onCreate 부분에 입력한다.
override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityLoginBinding.inflate(layoutInflater)
        setContentView(binding.root)

        KakaoSdk.init(this, "appkey")
        

카카오톡 로그인 API

카카오톡 로그인에는 kakao developers를 참조해서 작성하였다.

  • 카카오톡 로그인
    카카오톡으로 로그인시 UserApiClient의 loginWithKakaoTalk()을 호출.
    loginWithKakaoTalk() 호출되면 Android SDK가 카카오톡 실행하고 사용자에게 앱 이용 관련 동의를 구하는 동의 화면 출력.

호출 시 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)
            }
        }
profile
뉴비 프로그래머

0개의 댓글