Firebase Google認証

FirebaseでのGoogle認証のKotlinでのコードです。

ほとんどマニュアル通りなんですが、ちょっとだけハマったので残しておきます。

GoogleSignIn.getSignedInAccountFromIntent

この処理、非同期なんですが、addOnCompleteListenerで後続処理してやる必要はないそうです。

が、処理確認の.getResultのところで、.getResult(ApiException::class.java)をしてやらないと、ApiException:12502でエラーになっちゃうことがあります。

エラーコード12502というのは、ここにあるように、サインイン処理中ということ、ちょっと待てということなんでしょうが。

マニュアル上ではしれっと書いてますが。。。

private lateinit var mAuth: FirebaseAuth
private lateinit var mGoogleSignInClient : GoogleSignInClient

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.XXXX)

    val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
        .requestIdToken(getString(R.string.default_web_client_id))
        .requestEmail()
        .build()
    mGoogleSignInClient = GoogleSignIn.getClient(this, gso)
    mAuth = FirebaseAuth.getInstance()

    googleSignIn()
}

private fun googleSignIn(){
    var googleSignInIntent = mGoogleSignInClient?.signInIntent
    startActivityForResult(googleSignInIntent, RC_SIGN_IN)
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == RC_SIGN_IN){
        var task = GoogleSignIn.getSignedInAccountFromIntent(data)
        task.addOnCompleteListener {
            try {
                var account = task.getResult(ApiException::class.java)
                if (account != null) firebaseAuthWithGoogle(account)
            } catch (e: Exception) {
               //Action for error
            }
        }
    }
}

private fun firebaseAuthWithGoogle(acct : GoogleSignInAccount){
    val credential = GoogleAuthProvider.getCredential(acct.idToken, null)
    mAuth.signInWithCredential(credential)
        .addOnCompleteListener(this) {
            if (it.isSuccessful){
                //Action for success
            } else {
                //Action for error
            }
        }
}

シェアする

  • このエントリーをはてなブックマークに追加

フォローする