Firebase 令牌身份验证错误

Posted

技术标签:

【中文标题】Firebase 令牌身份验证错误【英文标题】:Firebase Token Authentication error 【发布时间】:2017-02-24 17:59:38 【问题描述】:

我正在使用 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 中登录。

【问题讨论】:

您能否发布一些额外的代码,以便我们看看您实际在做什么并最好重现它?有关更多信息,请参阅***.com/help/mcve :) 【参考方案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);
            
        );

这可能会解决您的问题

注意:最初在您的 Firebase 项目中启用匿名登录。认证 -> 登录方式

【讨论】:

总是出现 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】:

以下步骤对我有用:

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

    在 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'
     
    

    确保在 build.gradle(项目根文件夹)中添加以下依赖项

    dependencies 
    
    classpath 'com.android.tools.build:gradle:2.2.3'
    classpath 'com.google.gms:google-services:3.0.0'
    
    
    

    在您的活动中下载文件时添加以下代码:

    // 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,请尝试这样。

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

    制作(您的)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()
    

    在您的应用程序中初始化管理器。

class YourApplication : Application() 

    ...

    override fun onCreate() 
        super.onCreate()

        initGoogleUserManager()
    

    ...

    private fun initGoogleUserManager() 
        YourGoogleUserManager.init(this)
    

    在您的片段(或活动)中使用管理器

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 上的所有用户进行了身份验证。

【讨论】:

以上是关于Firebase 令牌身份验证错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 Facebook 令牌的 Firebase Unity SDK 身份验证

如何针对 Firebase 验证身份验证令牌?

使用 Firebase 身份验证进行身份验证后检索 Google 访问令牌

我可以使用啥密钥来验证 Facebook 登录生成的 Firebase 身份验证令牌

如何使用 Firebase 刷新令牌保持用户身份验证?

Firebase Android 身份验证失败:expired_token(身份验证令牌已过期)