Kotlin: аутентификация пароля Firebase - PullRequest
0 голосов
/ 16 июня 2020

Заранее извиняюсь за вопрос о ладье ie - я уже некоторое время пытаюсь ответить на этот запрос и обращаюсь к Stack Overflow в надежде решить эту небольшую проблему.

Проблема

В моем случае кажется, что метод Firebase для входа пользователя через электронную почту (signInWithEmailAndPassword), похоже, не работает.

Моя текущая настройка такова:

  • AuthFragment, Фрагмент, который вызывает методы из родительского Activity, AuthActivity.
  • AuthActivity, Activity, который содержит несколько методов / самоопределяемых функций:
    • 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."* 1 046 *

  • "User authentication failed."

Однако у меня было это только как ответ в Logcat:

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

Вся помощь приветствуется, спасибо!

1 Ответ

0 голосов
/ 16 июня 2020

Я потерял несколько часов на этом, поэтому позвольте мне поделиться своим опытом по этому поводу.

Gms означает «Google Mobile Services», и это, по сути, дополнительный API к Android, разработанный Google, который позволяет подключаться к множеству сервисов, предоставляемых Google. Если вы используете флаттер, это, вероятно, заключено в пакеты флаттера, которые вы используете, такие как firebase_auth, flutter_facebook_login или / и google_sign_in.

Эта ошибка может иногда обрабатываться компонентами более высокого уровня, поэтому, если у вас есть эта ошибка, она не означает, что ваша конфигурация неверна или она не будет работать. В моем случае у меня была эта ошибка с успешным конечным результатом, когда я входил в систему с помощью Google Sign in, примерно так:

info flutter.tools W / BiChannelGoogleApi (4106): [FirebaseAuth:] getGoogleApiForMethod () вернул Gms : com.google.firebase.auth.api.internal. zzak@8116b2c info flutter.tools D / FirebaseAuth (4506): Уведомление слушателей токенов идентификатора о пользователе (lCZZZZJELWhGUZZZZB3vDklZZZZ2). info flutter.tools D / FirebaseAuth (4506): Уведомление слушателей состояния аутентификации о пользователе (lCZZZZJELWhGUZZZZB3vDklZZZZ2). info 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, et c .... У меня есть вызов дротика 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. Иногда я тупица, но дело в том, что нет никаких предупреждений или спецификаций c ошибка нигде нет, так что вот список вещей, которые могут дать сбой с Firebase и другими плагинами:

Убедитесь, что вы правильно настроили поставщика входа (google, facebook, et c.) I n Консоль Firebase Обновите все пакеты flutter. Я лично не использую версии пакетов, я использую все пакеты flutter последней версии. А я использую AndroidX. В конкретном случае c Facebook Auth (я считаю, что Google Sign In намного проще интегрировать):

убедитесь, что вы смотрите на хорошее приложение, убедитесь, что идентификатор приложения и секрет приложения являются правильными. В консоли разработчика Facebook проверьте настройки Basi c. убедитесь, что вы добавили продукт «Вход в Facebook». Если вы не видите его в левом меню, в консоли разработчика Facebook проверьте панель инструментов и добавьте ее. в настройках продукта «Вход в Facebook» убедитесь, что вы добавили «Действительные URI перенаправления OAuth», которые предоставляет вам консоль Firebase (в конфигурации поставщика входа в Facebook). Вы можете проверить это в инструменте «Redirect URI validator» ниже на этой странице. в базовых c настройках приложения, если вы используете флаттер (=> мобильные платформы), убедитесь, что у вас есть раздел / платформа IOS и Android раздел / платформа. Для этого вы можете сделать это вручную «Добавить платформу» или воспользоваться быстрым стартом. в конце, раздел IOS может содержать только «идентификатор пакета», а раздел Android должен содержать «имя пакета Google Play», «имя класса» и по крайней мере один «ключевой хеш» (для отладки) . Если вы не знаете, как создать ha sh, воспользуйтесь быстрым запуском «Вход в Facebook». Надеюсь, это поможет

...