Kotlin:Firebase密码身份验证

时间:2020-06-16 12:04:29

标签: android firebase kotlin firebase-authentication

针对菜鸟问题的预先道歉-我已经尝试了一段时间,现在转向Stack Overflow,以期解决这个小问题。

问题

就我而言,似乎通过电子邮件(signInWithEmailAndPassword)登录用户的Firebase方法似乎无效。

我当前的设置是这样

  • AuthFragment,这是一个从其父活动AuthActivity调用方法的片段。
  • AuthActivity,一个包含几个方法/自定义函数的活动:
    • validate(),它检查电子邮件和密码输入是否有效
    • signIn(),它使用Firebase的signInWithEmailAndPassword方法登录用户。

以下是我的代码段:

AuthActivity.kt

package com.example.myApplication

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.Toast
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.auth.ktx.auth
import com.google.firebase.ktx.Firebase

class AuthActivity : AppCompatActivity() {

    private lateinit var auth: FirebaseAuth

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

    fun validate(email: String?, password: String?): Boolean {
        return ((email != null) && (password != null)) && (password.length >= 5) && (email.contains("@"))
    }

    fun signIn(email: String, password: String) {
        auth = Firebase.auth
        Log.d("Auth", "Attempting to authenticate...")
        auth.signInWithEmailAndPassword(email, password).addOnCompleteListener(this) { task ->
            Log.d("Auth", "Result supposedly received.")
            if (task.isSuccessful) {
                Log.d("Auth", "User authentication successful.")
                Toast.makeText(this, task.result.toString(), Toast.LENGTH_LONG).show()
            } else {
                Log.d("Auth", "User authentication failed.")
                Toast.makeText(this, "User authentication failed. Please try again.", Toast.LENGTH_LONG).show()
            }
        }
    }
}

AuthFragment.kt

package com.example.myApplication

import android.os.Bundle
import android.util.Log
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.TextView
import android.widget.Toast

class AuthFragment : Fragment() {

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val root = inflater.inflate(R.layout.fragment_auth, container, false)

        val emailField = root.findViewById<TextView>(R.id.auth_emailField)
        val passwordField = root.findViewById<TextView>(R.id.auth_passwordField)
        val signInButton = root.findViewById<Button>(R.id.auth_signInButton)

        signInButton.setOnClickListener {
            val authActivity = AuthActivity()
            val email = emailField.text.toString()
            val password = passwordField.text.toString()
            val valid = authActivity.validate(email, password)
            Log.d("Auth", valid.toString())

            if (valid) {
                authActivity.signIn(email, password)
            } else {
                Toast.makeText(activity, "Some fields are not properly filled. Please try again.", Toast.LENGTH_LONG).show()
            }
        }

        return root
    }
}

期望

看看AuthActivity中的代码,我希望在Logcat中出现以下结果之一:

  • "User authentication successful."

  • "User authentication failed."

但是,我仅在Logcat中将此作为响应:

I/BiChannelGoogleApi: [FirebaseAuth: ] getGoogleApiForMethod() returned Gms: com.google.firebase.auth.api.internal.zzaq@60b999e

感谢所有帮助,谢谢!

1 个答案:

答案 0 :(得分:0)

我在这个上损失了几个小时,所以让我分享一下我的经验。

Gms代表“ Google移动服务”,它基本上是Google开发的Android的附加API,可连接到Google提供的一系列服务。如果您使用flutter,则可能是由您使用的flutter包(例如firebase_auth,flutter_facebook_login或/和google_sign_in)包装的。

该错误有时可能是由更高级别的组件处理的,因此,如果您遇到该错误,并不表示您的配置错误或无法正常工作。就我而言,使用Google登录进行登录时,我遇到此错误并获得成功的最终结果,如下所示:

info flutter.tools W / BiChannelGoogleApi(4106):[FirebaseAuth:] getGoogleApiForMethod()返回了Gms:com.google.firebase.auth.api.internal.zzak@8116b2c 信息flutter.tools D / FirebaseAuth(4506):通知ID令牌侦听器有关用户(lCZZZZJELWhGUZZZZB3vDklZZZZ2)。 info flutter.tools D / FirebaseAuth(4506):通知有关用户的身份验证状态侦听器(lCZZZZJELWhGUZZZZB3vDklZZZZ2)。 信息flutter.tools I / flutter(4506):FirebaseUser({uid:lCZZZZJELWhGUZZZZB3vDklZZZZ2,photoUrl:https://lh5.googleusercontent.com/-ZZzir_P-ENw/AAAAAAAAAAI/AAAAAAAAAAA/PpxhiXg_ISk/s96-c/photo.jpg,isAnonymous:false,... 我有个飞镖叫print(fireUser);在我的代码中,我们看到它是成功的。

但是在Facebook Auth的情况下,我只是遇到了此事,此后什么也没发生,但是在Facebook服务器端,登录成功,因为我可以在Facebook开发者控制台中看到事件。

info flutter.tools W / BiChannelGoogleApi(4106):[FirebaseAuth:] getGoogleApiForMethod()返回了Gms:com.google.firebase.auth.api.internal.zzak@8116b2c 日志中没有其他内容,因此在此过程中有些卡住了。

我的问题是我将两个应用程序App Id和Secret混合在一起。有时候我很傻,但是问题是零警告或特定错误无处发生,因此这是Firebase和其他插件可能失败的事情的列表:

确保已在Firebase控制台中正确配置了登录提供程序(google,facebook等)。 升级所有Flutter软件包。我个人不使用软件包版本,而是使用所有flutter软件包的最新版本。我使用的是AndroidX。 对于Facebook Auth的特定情况(我发现Google登录更容易集成):

确保您看好的应用程序 确保应用程序ID和应用程序密码是正确的。在Facebook开发者控制台中,检查那里的基本设置。 确保您已添加“ Facebook登录”产品。如果您没有在左侧菜单中看到它,请在Facebook开发控制台中,检查仪表板并添加它。 在“ Facebook登录”产品设置中,确保已添加Firebase控制台为您提供的“有效OAuth重定向URI”(在Facebook登录提供程序配置中)。您可以在该页面下方的“重定向URI验证程序”工具中对其进行检查。 在应用程序的“基本设置”中,如果您使用flutter(=>移动平台),请确保您具有IOS部分/平台和Android部分/平台。要实现此目的,您可以手动“添加平台”或使用“快速入门”。 最后,“ IOS”部分只能包含“捆绑ID” 并且Android部分应包含“ Google Play包名称”,“类名称”和至少一个“密钥哈希”(用于调试)。如果您不知道如何创建哈希,请使用“ Facebook登录”快速入门。 希望对您有帮助