Seize the day

POST : Backend study

안드로이드 앱에서 Firebase의 JWT token 가져오기 실습

https://dajkim76.tistory.com/533 에서 이어서 ...

Firebase에 프로젝트 추가하기

1. firebase에 안드로이드 앱추가 : 

    sha1 hash 추가 : Authenticating Your Client  |  Google Play services  |  Google Developers  

./gradlew signingReport

2. google-services.json 다운로드하여, app 폴더에 복사
   gradle 설정 추가 :   Android 프로젝트에 Firebase 추가 (google.com)

3. gradle에 auth 라이브러리 추가 : Firebase 인증 (google.com)

4. 각종. 로그인 처리 : FirebaseUI로 손쉽게 Android 앱에 로그인 추가 (google.com)

 

구글 로그인 테스트

snippets-android/auth at master · firebase/snippets-android (github.com) 참고

인증 체계에서 지원하는 인증 방식에 email 과 구글 로그인을 체크하고, 
Firebase 설정에 지원 email을 지정한다. 
OAuth2 web_client_id 는 인증탭에서 구하기 (R.string.default_web_client_id를 사용해도 문제는 없는 것 같다 )

    private val googleSignInClient: GoogleSignInClient by lazy {
        val googleSignInOptions = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken(getString(R.string.web_client_id))
            .requestEmail()
            .build()
        GoogleSignIn.getClient(this, googleSignInOptions)
    }

    @OnMenuClick(R.id.menu_google_login)
    fun onClickGoogleLogin(menuItem: MenuItem) {
        FirebaseAuth.getInstance().currentUser?.let {
            ToastUtils.show("이미 로그인됨: " + it.uid)
            return
        }
        startActivityForResult(googleSignInClient.signInIntent, 1)
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == 1) {
            val task = GoogleSignIn.getSignedInAccountFromIntent(data)
            try {
                // Google Sign In was successful, authenticate with Firebase
                val account = task.getResult(ApiException::class.java)!!
                Log.d(TAG, "firebaseAuthWithGoogle:" + account.id)
                firebaseAuthWithGoogle(account.idToken!!)
            } catch (e: ApiException) {
                // Google Sign In failed, update UI appropriately
                ToastUtils.show("Google sign in failed" + e.toString())
            }
        }
    }

    private fun firebaseAuthWithGoogle(idToken: String) {
        val credential = GoogleAuthProvider.getCredential(idToken, null)
        FirebaseAuth.getInstance().signInWithCredential(credential)
            .addOnCompleteListener(this) { task ->
                if (task.isSuccessful) {
                    // Sign in success, update UI with the signed-in user's information

                    val user = FirebaseAuth.getInstance().currentUser
                    ToastUtils.show("signInWithCredential:success = " + user?.uid)
                    //updateUI(user)
                } else {
                    // If sign in fails, display a message to the user.
                    ToastUtils.show("signInWithCredential:failure" +  task.exception.toString())
                    //updateUI(null)
                }
            }
    }

 

Firbase functions 호출하기 (Firbasebse 로그인되어 있지 않으면 실패를 응답하므로 먼저 로그인)

앱에서 함수 호출  |  Firebase (google.com)  참고

    @OnMenuClick(R.id.menu_create_jwt)
    fun onClickCreateJwt(menuItem: MenuItem) {
        val text: String = JSONObject()
            .put("expireSeconds", 60 * 60 * 24)
            .put("did", "my_did")
            .put("muid", "my_muid")
            .toString()

        val data = hashMapOf(
            "text" to text
        )

        FirebaseFunctions.getInstance()
            .getHttpsCallable("createJwtToken")
            .call(data)
            .addOnCompleteListener { task ->
                if (task.isSuccessful) {
                    val dataString = task.result?.data?.toString()
                    val dataMap = task.result?.data as? Map<String, Object>;
                    if (dataMap != null) {
                        if ((dataMap["code"] as? Int) == 0) {
                            val resultMap = dataMap["result"] as? Map<String, Object>
                            val token = resultMap?.get("token") as? String
                            val exp = resultMap?.get("exp") as? Int
                            Log.d("__T", "token= $token\nexp=$exp")
                            DUtils.alert("token= $token\nexp=$exp")
                        }
                    }
                } else {
                    val e = task.exception
                    if (e is FirebaseFunctionsException) {
                        val code = e.code
                        val details = e.details
                    }
                    DUtils.alert(e.toString())
                }
            }
    }

 

TODO:  App check라는게 있어서 호출하는 앱이 유효한지 한 번 더 검증해주는 것 같다. 
Android에서 SafetyNet으로 앱 확인 활성화  |  Firebase (google.com) 

top

posted at

2021. 8. 9. 16:30


CONTENTS

Seize the day
BLOG main image
김대정의 앱 개발 노트와 사는 이야기
RSS 2.0Tattertools
공지
아카이브
최근 글 최근 댓글
카테고리 태그 구름사이트 링크