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)