【问题标题】:Firebase Token Authentication errorFirebase 令牌身份验证错误
【发布时间】:2021-09-23 14:20:09
【问题描述】:

我正在使用 firebase 存储上传文件,但是当我上传时出现此错误

E/StorageUtil: error getting token java.util.concurrent.ExecutionException: com.google.android.gms.internal.zzand: Please sign in before trying to get a token.

我用谷歌搜索了它,但无法得到答案! 我已在 firebase 中登录。

【问题讨论】:

  • 您能否发布一些额外的代码,以便我们看看您实际在做什么并最好重现它?有关更多信息,请参阅stackoverflow.com/help/mcve :)

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


【解决方案1】:

我认为您在上传文件之前没有签名。在启动器活动的 onCreate() 中,试试这个代码

FirebaseAuth mAuth = FirebaseAuth.getInstance(); 

然后在onStart()中,

FirebaseUser user = mAuth.getCurrentUser();
if (user != null) {
  // do your stuff
} else {
  signInAnonymously();
}

匿名签名()

private void signInAnonymously() {
    mAuth.signInAnonymously().addOnSuccessListener(this, new  OnSuccessListener<AuthResult>() {
            @Override
            public void onSuccess(AuthResult authResult) {
                // do your stuff
            }
        })
        .addOnFailureListener(this, new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception exception) {
                Log.e(TAG, "signInAnonymously:FAILURE", exception);
            }
        });
}

这可能会解决您的问题

【讨论】:

  • 总是出现 onFailure :-(
  • 您需要通过 Firebase 控制台中的“Authentication->SIGN-IN METHOD”启用匿名登录,您的应用才能执行此操作。
  • 没错,您需要在项目中启用“匿名”作为“登录方法”之一。您不需要实现 .signInAnonymously(),只要您的存储规则允许未经身份验证的写入,它就可以在没有它的情况下工作。我对同样的错误消息感到困惑,但我相信它只会在你无论如何都会被拒绝时发生......
  • 在执行此操作之前,请确保您的 Gradle(模块)中有此依赖项: implementation 'com.google.firebase:firebase-storage:10.2.0' implementation 'com.google.firebase:firebase -auth:10.2.0' 实施 'com.google.firebase:firebase-core:10.2.0' 实施 'com.google.firebase:firebase-database:10.2.0' 实施 'com.firebase:firebase-client-android :2.4.0' 之后,在 Firebase 控制台中启用正确的登录提供程序(登录选项卡)
【解决方案2】:

我遇到了同样的问题,这是因为默认情况下,firebase 只允许上传已通过身份验证的用户的文件。

在 storage util 异常之上可能有类似这样的日志:

E/StorageUtil: error getting token java.util.concurrent.ExecutionException: com.google.android.gms.internal.zzajb: Please sign in before trying to get a token.

我们有自己的身份验证过程,不使用 firebase,因此我们决定更改 firebase 控制台中的存储规则。

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
    allow read, write;
    }
  }
}

注意:更改规则将允许任何用户将文件上传到您的 Firebase 云服务器。

【讨论】:

  • 尽管我可以上传和下载文件,但即使使用这些设置,我也会收到此异常消息
【解决方案3】:

也许您只是无法“开始”使用 Firebase。我说是因为我创建了一个项目,通过 Android Studio IDE 连接到 firebase 存储,但我必须在控制台上手动“开始”。

【讨论】:

    【解决方案4】:

    以下步骤对我有用:

    1. 从带有包 ID 的 firebase 生成正确的 google-services.json

    2. 在 build.gradle(app) 中

       dependencies {
      
       compile 'com.google.firebase:firebase-storage:10.2.0'
       compile 'com.google.firebase:firebase-auth:10.2.0'
       compile 'com.google.firebase:firebase-core:10.2.0'
       compile 'com.google.firebase:firebase-database:10.2.0'
       compile 'com.firebase:firebase-client-android:2.4.0'
       }
      
    3. 确保在 build.gradle(项目根文件夹)中添加以下依赖项

      dependencies {
      
      classpath 'com.android.tools.build:gradle:2.2.3'
      classpath 'com.google.gms:google-services:3.0.0'
      
      }
      
    4. 在您的活动中下载文件时添加以下代码:

      // Declaration reference
      private StorageReference storageRef;
      
      
      private void downloadImageFromFireBase()
      {
      showProgressDialog("Downloading image..");
      
      storageRef = storage.getReferenceFromUrl("gs://XXX.appspot.com/").child("av"+ datePassed +".jpg");
      showImageFromFireBaseDataBase();
      }
      
      private void showImageFromFireBaseDataBase()
      {
          try {
              final File localFile = File.createTempFile("images", "jpg");
              final Bitmap[] bitmap = new Bitmap[1];
                  storageRef.getFile(localFile).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {
                      @Override
                      public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {
                          Log.e("Test", "success!");
                          bitmap[0] = BitmapFactory.decodeFile(localFile.getAbsolutePath());
                          raysImage.setImageBitmap(bitmap[0]);
                      }
                  }).addOnFailureListener(new OnFailureListener() {
                      @Override
                      public void onFailure(@NonNull Exception exception) {
                          Log.e("Test", "fail :( " + exception.getMessage());
                      }
                  });
              }catch(IOException e){
              Log.e("ImageView",e.toString());
              }
          }
      

    【讨论】:

    • 这里提供的答案帮助我在回收视图适配器中,谢谢
    【解决方案5】:

    您必须先登录 FirebaseAuth。

    您可以匿名登录,

    但如果您想登录用户的 google id,请尝试这样。

    我创建了一个易于使用的管理器类。


    1. 制作(您的)GoogleUserManager 类

    object YourGoogleUserManager {
    
        private lateinit var gso: GoogleSignInOptions
        private lateinit var firebaseAuth: FirebaseAuth
    
        fun init(context: Context) {
            firebaseAuth = FirebaseAuth.getInstance()
            gso = GoogleSignInOptions
                .Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestIdToken(context.getString(R.string.default_web_client_id))
                .build()
        }
    
        fun startGoogleSignInForResult(
            fragment: Fragment,
            onSuccess: (AuthResult) -> Unit,
            onFail: (Exception) -> Unit
        ): ActivityResultLauncher<Intent> {
            return fragment.registerForActivityResult(
                ActivityResultContracts.StartActivityForResult()
            ) {
                val task = GoogleSignIn.getSignedInAccountFromIntent(it.data)
                handleGoogleSignInResult(task, onSuccess, onFail)
            }
        }
    
        fun signIn(
            activityResultLauncher: ActivityResultLauncher<Intent>,
            activity: Activity
        ) {
    
            val googleSignInClient = GoogleSignIn.getClient(activity, gso)
    
            activityResultLauncher.launch(googleSignInClient.signInIntent)
        }
    
        private fun handleGoogleSignInResult(
            task: Task<GoogleSignInAccount>,
            onSuccess: (AuthResult) -> Unit,
            onFail: (Exception) -> Unit
        ) {
            try {
                val account = task.getResult(ApiException::class.java)
                val credential = GoogleAuthProvider.getCredential(account?.idToken, null)
                firebaseAuth.signInWithCredential(credential)
                    .addOnSuccessListener {
                        CatHolicLogger.log("success to firebase google sign in")
                        onSuccess(it)
                    }
                    .addOnFailureListener {
                        CatHolicLogger.log("fail to firebase google sign in")
                        onFail(it)
                    }
            } catch (e: ApiException) {
                CatHolicLogger.log("fail to firebase google sign in")
                onFail(e)
            }
        }
    
        fun signOut() {
            firebaseAuth.signOut()
        }
    }
    
    1. 在您的应用程序中初始化管理器。

    class YourApplication : Application() {
    
        ...
    
        override fun onCreate() {
            super.onCreate()
    
            initGoogleUserManager()
        }
    
        ...
    
        private fun initGoogleUserManager() {
            YourGoogleUserManager.init(this)
        }
    }
    
    1. 在您的片段(或活动)中使用管理器

    class YourFragment : Fragment() {
    
        ...
        ...
    
        private val startGoogleSignInForResult =
            YourGoogleUserManager.startGoogleSignInForResult(this, onSuccess = {
                // your job after success to sign in
            }, onFail = {
                // your job after fail to sign in
            })
    
        ...
        ...
    
        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
    
            binding.signInButton.setOnClickListener {
                YourGoogleUserManager.signIn(startGoogleSignInForResult, requireActivity())
            }
        }
    }
    

    【讨论】:

      【解决方案6】:

      这可以像互联网连接一样简单,也就是说,如果您的所有代码都是正确的,并且您已经对 firebase 上的所有用户进行了身份验证。

      【讨论】:

        猜你喜欢
        • 2020-08-18
        • 1970-01-01
        • 1970-01-01
        • 2022-07-16
        • 1970-01-01
        • 1970-01-01
        • 2019-06-28
        • 2011-12-01
        相关资源
        最近更新 更多