【问题标题】:Firebase Authentication error in androidAndroid中的Firebase身份验证错误
【发布时间】:2017-08-30 18:40:42
【问题描述】:

Here is screen shot我当时正在尝试使用 Firebase 身份验证从 google 登录,但在我的项目中出现错误

com.google.firebase.auth.FirebaseAuthException: 这个操作不是 允许。您必须在控制台中启用此服务。它还说 ERROR_OPERATION_NOT_ALLOWED

不允许此操作。您必须在控制台中启用此服务。

【问题讨论】:

  • 您使用的是 google-services.json 还是 google-services(2).json...screenshot show to file 确保将其重命名为 google-services.json only
  • 是的,我删除了旧的 json 文件并添加了新文件
  • @manji 你解决了那个问题吗?我面临同样的问题

标签: android firebase firebase-realtime-database firebase-authentication


【解决方案1】:

正如您所说的,您需要在 Firebase console 中启用身份验证。

这可以完成,访问您的项目 -> 身份验证菜单,登录方法 -> 然后启用所需的身份验证类型。

【讨论】:

  • 你能给我们截图吗?
  • 我的 Firebase 控制台
  • 是的,从您的 Firebase 控制台,确保它已启用。
  • 我添加了屏幕截图
  • 安全规则是否设置为 true 用于测试目的?
【解决方案2】:

您必须允许来自 firebase、使用电子邮件、facebook 或其他方式的 firebase 身份验证

Firebase 控制台 -> 身份验证 -> 登录方法,并启用您的应用将使用的登录方法

此处是 AuthActivity 类代码的完整示例:

package com.<you_domain>.<your_application_name>;

import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.drawable.ColorDrawable;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.multidex.MultiDex;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ProgressBar;
import android.widget.Toast;
import com.google.android.gms.auth.api.Auth;
import com.google.android.gms.auth.api.signin.GoogleSignInAccount;
import com.google.android.gms.auth.api.signin.GoogleSignInOptions;
import com.google.android.gms.auth.api.signin.GoogleSignInResult;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GoogleApiAvailability;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.AuthCredential;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.auth.GoogleAuthProvider;

public class AuthActivity extends AppCompatActivity
    implements GoogleApiClient.OnConnectionFailedListener,
    View.OnClickListener{

private Context authActivity;

private static int RC_SIGN_IN = 1;
private static String TAG = "AUTH_ACTIVITY";
private GoogleApiClient mGoogleApiClient;
private FirebaseAuth mAuth;
private FirebaseAuth.AuthStateListener mAuthListener;

private AlertDialog alertDialog;

private android.app.AlertDialog splashDialog;

@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    MultiDex.install(this);
}

@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);

    authActivity = this;

    setContentView(R.layout.auth_activity);

    Window window = this.getWindow();

    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        window.setStatusBarColor(ContextCompat.getColor(this, R.color.colorPrimaryDark));
    }

    GoogleApiAvailability api = GoogleApiAvailability.getInstance();
    int gpsAvail = api.isGooglePlayServicesAvailable(authActivity);

    if(Connection.isInternetConnected(authActivity)){

        if(gpsAvail == ConnectionResult.SUCCESS){

        mAuth = FirebaseAuth.getInstance();
        mAuthListener = new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {

                FirebaseUser user = firebaseAuth.getCurrentUser();

                if(user != null){
                    Log.d("AUTH", "user logged in: " + user.getEmail());
                }else{
                    Log.d("AUTH", "user logged out.");
                }
            }
        };

        GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.
                DEFAULT_SIGN_IN).requestIdToken(getString(R.string.default_web_client_id))
                .requestEmail()
                .build();

        mGoogleApiClient = new GoogleApiClient.Builder(authActivity)
                .enableAutoManage(this, this)
                .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
                .build();

        findViewById(R.id.sign_in_btn).setOnClickListener(this);

    }else if(gpsAvail == ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED){

        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(authActivity);

        alertDialogBuilder.setCancelable(false);
        alertDialogBuilder.setTitle("Google Play Services out of date");
        alertDialogBuilder.setMessage("Your Google Play Services version is out of date. " +
                "Please update it and continue.");
        alertDialogBuilder.setIcon(android.R.drawable.ic_dialog_alert);

        alertDialogBuilder.setPositiveButton(" UPDATE ", new DialogInterface.OnClickListener()
        {
            public void onClick(DialogInterface dialog, int id)
            {

                String url = "https://play.google.com/store/apps/" +
                        "details?id=com.google.android.gms";
                Intent i = new Intent(Intent.ACTION_VIEW);
                i.setData(Uri.parse(url));
                startActivity(i);

            }
        });

        alertDialog = alertDialogBuilder.create();

        alertDialog.setOnShowListener( new DialogInterface.OnShowListener() {
            @Override
            public void onShow(DialogInterface arg0) {
                alertDialog.getButton(AlertDialog.BUTTON_POSITIVE)
                        .setTextColor(getColor(authActivity, R.color.colorPrimary));
            }
        });

        alertDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
            @Override
            public void onCancel(DialogInterface dialogInterface) {
                finish();
            }
        });

        alertDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
            @Override
            public void onDismiss(DialogInterface dialogInterface) {
                finish();
            }
        });

        alertDialog.show();

    }else{

        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(authActivity);

        alertDialogBuilder.setCancelable(false);
        alertDialogBuilder.setTitle("Google Play Services needed");
        alertDialogBuilder.setMessage("You need Google Play Services in order to proceed. " +
                "Please install the latest version.");
        alertDialogBuilder.setIcon(android.R.drawable.ic_dialog_alert);

        alertDialogBuilder.setPositiveButton(" INSTALL ", new DialogInterface.OnClickListener()
        {
            public void onClick(DialogInterface dialog, int id)
            {

                String url = "https://play.google.com/store/apps/" +
                        "details?id=com.google.android.gms";
                Intent i = new Intent(Intent.ACTION_VIEW);
                i.setData(Uri.parse(url));
                startActivity(i);

            }
        });

        alertDialog = alertDialogBuilder.create();

        alertDialog.setOnShowListener( new DialogInterface.OnShowListener() {
            @Override
            public void onShow(DialogInterface arg0) {
                alertDialog.getButton(AlertDialog.BUTTON_POSITIVE)
                        .setTextColor(getColor(authActivity, R.color.colorPrimary));
            }
        });

        alertDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
            @Override
            public void onCancel(DialogInterface dialogInterface) {
                finish();
            }
        });

        alertDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
            @Override
            public void onDismiss(DialogInterface dialogInterface) {
                finish();
            }
        });

        alertDialog.show();

    }

}else {

    try {
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(authActivity);

        alertDialogBuilder.setCancelable(false);
        alertDialogBuilder.setTitle("No internet connection");
        alertDialogBuilder.setMessage("Internet not available. " +
                "Please check your internet connectivity and try again.");
        alertDialogBuilder.setIcon(android.R.drawable.ic_dialog_alert);

        alertDialogBuilder.setPositiveButton(" OK ", new DialogInterface.OnClickListener()
        {
            public void onClick(DialogInterface dialog, int id)
            {
                dialog.cancel();
            }
        });

        alertDialog = alertDialogBuilder.create();

        alertDialog.setOnShowListener( new DialogInterface.OnShowListener() {
            @Override
            public void onShow(DialogInterface arg0) {
                alertDialog.getButton(AlertDialog.BUTTON_POSITIVE)
                        .setTextColor(getColor(authActivity, R.color.colorPrimary));
            }
        });

        alertDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
            @Override
            public void onCancel(DialogInterface dialogInterface) {
                finish();
            }
        });

        alertDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
            @Override
            public void onDismiss(DialogInterface dialogInterface) {
                finish();
            }
        });

        alertDialog.show();

    }
    catch(Exception e)
    {
        Log.d("Connection", "Show Dialog: " + e.getMessage());
    }

}

}

@Override
protected void onStart() {
    super.onStart();
    if(mAuthListener != null) {
        mAuth.addAuthStateListener(mAuthListener);
    }
}

@Override
protected void onStop() {
    super.onStop();
    if(mAuthListener != null){
        mAuth.removeAuthStateListener(mAuthListener);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if(requestCode == RC_SIGN_IN){

        GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);

        if(result.isSuccess()){
            GoogleSignInAccount account = result.getSignInAccount();
            firebaseAuthWithGoogle(account);

        }else{
            Log.d(TAG, "Google Login Failed");

            Toast.makeText(authActivity, "Sign in failed.", Toast.LENGTH_LONG).show();

        }

    }

}

private void firebaseAuthWithGoogle(GoogleSignInAccount acct){

    AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
    mAuth.signInWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    Log.d("AUTH", "signInWithCredential:oncomplete: " + task.isSuccessful());

                    FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

                    if(user != null){

                        Intent intent = new Intent(AuthActivity.this, MainActivity.class);
                        startActivity(intent);
                        //splashDialog.dismiss();
                        splashDialog.cancel();

                        Toast.makeText(authActivity, "Successfully signed in",
                                Toast.LENGTH_LONG).show();

                        finish();

                    }

                }
            });

}

private void signIn(){
    Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
    startActivityForResult(signInIntent, RC_SIGN_IN);
}

@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

    Log.d(TAG, "Connection failed.");

}

@Override
public void onClick(View view) {

    switch(view.getId()){

        case R.id.sign_in_btn:

            splashDialog = ProgressDialog.show(this, null, null);
            ProgressBar spinner = new android.widget.ProgressBar(this, null,
                    android.R.attr.progressBarStyle);
            spinner.getIndeterminateDrawable().setColorFilter(getColor(this,
                    R.color.colorPrimary), android.graphics.PorterDuff.Mode.SRC_IN);
            splashDialog.getWindow().setBackgroundDrawable(
                    new ColorDrawable(android.graphics.Color.TRANSPARENT));
            splashDialog.setContentView(spinner);
            splashDialog.setCancelable(false);

            signIn();

            break;

    }

}

@Override
public void onDestroy() {
    super.onDestroy();

    if (splashDialog != null) {
        splashDialog.cancel();
        splashDialog = null;
    }

}

@SuppressWarnings("deprecation")
public static int getColor(Context context, int id) {
    final int version = Build.VERSION.SDK_INT;
    if (version >= 23) {
        return ContextCompat.getColor(context, id);
    } else {
        return context.getResources().getColor(id);
    }
}

}

【讨论】:

  • 看到我添加了屏幕
  • 您启用了其中一种方法,但仍然不起作用?
  • 您是否修改了实时数据库中的规则?
  • 见第二张截图。规则应该是这样的
  • 我给过这样的..{ "rules": { ".read": true, ".write":true } } 是对还是错
【解决方案3】:

以下步骤对我有用

  1. 转到 Firebase 控制台并为所需的登录方法启用 Firebase 身份验证(主要是其“电子邮件和密码”和“匿名”
  2. 从控制台下载您的 google-services.json 文件,将其替换为现有文件
  3. 重建您的项目

它对我有用,我希望它也对你有用。

P.S:我添加这个答案是因为没有其他答案提到替换 json 文件,我认为这实际上为我做了工作。

【讨论】:

    【解决方案4】:

    我也遇到了同样的问题。没有任何帮助,包括玩规则和 gradle 添加、启用等等。唯一的解决方案是 onCreate():

    ...                                                           
        FirebaseOptions options = new FirebaseOptions.Builder()
                .setApiKey("AIzaSyA61lkklrz_K_vXsrUUiug9LwImK3sg26bE")//https://console.developers.google.com/apis/credentials?project=korisanjish-92e92
                .setApplicationId("uz.man.speach.gapi")
                .setDatabaseUrl("https://korisanjish-92e92.firebaseio.com/")
                .build();
         fbApp = FirebaseApp.initializeApp(getApplicationContext(), options, "SpeachGAPIMaximTest");
        fbDB = FirebaseDatabase.getInstance(fbApp);
        fbDB.setPersistenceEnabled(true);                                   
         ...
    

    在 onStart() 中:

    ...                                                                        
        mAuth = FirebaseAuth.getInstance(fbApp);//
         List<FirebaseApp> lLcl= FirebaseApp.getApps(this);
        for(FirebaseApp fb : lLcl){
            l.a(fb.getName());
        }
    
        showWheel();
        mAuth.signInWithEmailAndPassword("rusti@gmail.com", "U$pe$hn11Proekt")
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (task.isSuccessful()) {
                            // Sign in success, update UI with the signed-in user's information
                            l.a( "signInWithEmail:success");
                            FirebaseUser currentUser = mAuth.getCurrentUser();
    
                            if(currentUser==null)
                                l.a(434343);
                            else
                                l.a( currentUser.getEmail());
                            stopWheel();
    
                        } else {
                            // If sign in fails, display a message to the user.
                            l.a( task.getException());
                            l.a(task.getException().getMessage());
                            Toast.makeText(MainActivity.this, "Authentication failed.",
                                    Toast.LENGTH_SHORT).show();
                            finish();
                        }
                    }
                });                                                           
             ...
    

    在一个方法中:

    private void sendToFireBase() {
        MainActivity activityLcl = (MainActivity) getActivity();
        DatabaseReference mDatabase = activityLcl.getFbDB().getReference();
        String sLcl = (String) hashMap.get("Item ID");
        User userLcl = new User(altitudeDouble, location.getLongitude(), location.getLatitude(), urlString,
                textString, languageString, preceededIdString, sLcl);
        //Double altitude, Double longitude, Double latitude, String url, String text, String locale, String preceededId
    
        FirebaseAuth mAuthLcl = activityLcl.getAuth();
        activityLcl.showWheel();
        mDatabase.child("users").child(mAuthLcl.getUid()).setValue(userLcl, new DatabaseReference.CompletionListener() {
            public void onComplete(DatabaseError error, DatabaseReference ref) {
                MainActivity activityLcl = (MainActivity) getActivity();
                String s2Lcl = "";
                if (null == error) {
                    s2Lcl = "Uploaded";
                } else
                    s2Lcl = error.getDetails();
                activityLcl.showMessage("Value was set. Status = " + s2Lcl);
    
                l.a("Value was set. Error = " + s2Lcl);
                activityLcl.stopWheel();
            }
        });
    }
    

    我在strings.xml 中的另一个错误是app_name 在一个字母中是错误的。

    【讨论】:

      【解决方案5】:

      尝试以上所有答案,但仍然无法正常工作 用新的 google-services.json 替换 google-services.json 文件。它对我有用,现在就去做。

      【讨论】:

        【解决方案6】:

        我知道这是一个老问题,但我最近遇到了一个类似的问题并想出了如何解决它。就我而言,我的问题在于我如何创建传递给 startActivityForResultSignInIntent

        和你一样,我也在 Firebase 控制台中正确配置了 Google 身份验证方法,并复制了 Firebase 文档页面 (https://firebaseopensource.com/projects/firebase/firebaseui-android/auth/README.md) 中提供的示例代码。

        但是,每次尝试连接时,我都会遇到与您相同的错误。然后我意识到在调用 startActivityForResult 时我没有激活 Google Provider。起初,我尝试了下面的代码,但没有成功。

        startActivityForResult(
            AuthUI.getInstance()
                  .createSignInIntentBuilder()
                  .build(),
                   RC_SIGN_IN);
        

        然后我将其更改为下面的代码并让它工作!

        startActivityForResult(
            AuthUI.getInstance()
                .createSignInIntentBuilder()
                .setAvailableProviders(Arrays.asList(                        
                        AuthUI.IdpConfig.GoogleBuilder().build()))
                .build(), RC_SIGN_IN)
        

        请注意,第一个代码 sn-p 未使用 Google Provider,因此它依赖于用户/密码身份验证方法。如果您在 Firebase 控制台中启用此方法,则此 sn-p 将完美运行。

        【讨论】:

          【解决方案7】:

          我在使用 Nativescript 应用程序时遇到了同样的问题,直到我删除了我的 node_modules 和平台文件夹并重建了项目,我才解决了这个问题。这解决了我的问题。换句话说(这可能适用于 TNS 甚至移动以外的其他框架),删除您生成的文件并重新生成以重新生成它们。

          希望这对某人有所帮助!我知道我花了很长时间才尝试这个:p

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-06-18
            • 2017-10-11
            • 1970-01-01
            • 1970-01-01
            • 2017-01-25
            • 1970-01-01
            相关资源
            最近更新 更多