Firebase 权限被拒绝(读取和写入)与身份验证

Posted

技术标签:

【中文标题】Firebase 权限被拒绝(读取和写入)与身份验证【英文标题】:Firebase Permission denied (read and write) with Authentication 【发布时间】:2016-11-07 00:50:18 【问题描述】:

我想通过身份验证在我的数据库中读取和写入,但我得到了两者的Permission denied。我试图弄清楚为什么它不起作用。

我使用默认规则,因为我想要身份验证,如文档中所述。

默认规则需要身份验证。它们允许对您的应用程序的经过身份验证的用户进行完全读写 > 访问。如果您希望数据对您应用的所有用户开放,但又不希望它向全世界开放,它们会很有用。

Firebase 规则:


  "rules": 
    ".read": "auth != null",
    ".write": "auth != null"
  

创建用户:

   auth.createUserWithEmailAndPassword(email, password)
        .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() 
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) 
                Log.d("USER_CREATE", "createUserWithEmail:onComplete:" + task.isSuccessful());

                // If sign in fails, display a message to the user. If sign in succeeds
                // the auth state listener will be notified and logic to handle the
                // signed in user can be handled in the listener.
                if (!task.isSuccessful()) 
                    Toast.makeText(getApplicationContext(), "Authentication failed.",
                            Toast.LENGTH_SHORT).show();
                 else 
                    startActivity(new Intent(SignupActivity.this, MainActivity.class));
                    finish();
                

                // ...
            
        );

登录用户:

auth.signInWithEmailAndPassword(email, password)
        .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() 
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) 
                Log.d("COMPLETE", "signInWithEmail:onComplete:" + task.isSuccessful());
            
        );

我收到了AuthListener,它记录了我用户已登录。

AuthListener:

mAuthListener = new FirebaseAuth.AuthStateListener() 
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) 
            FirebaseUser user = firebaseAuth.getCurrentUser();
            if (user != null) 
                // User is signed in
                Log.d("TAG", "onAuthStateChanged:signed_in:" + user.getUid());
             else 
                // User is signed out
                Log.d("TAG", "onAuthStateChanged:signed_out");
            
            // ...
        
    ;
    // ...

读取测试:(我在数据库中手动添加了一个节点)

firebase.child("test").addValueEventListener(new ValueEventListener() 

    @Override
    public void onDataChange(DataSnapshot snapshot) 
        Log.d("result", snapshot.getValue()+"");
    

    @Override
    public void onCancelled(FirebaseError error) 
        Log.d("The read failed: ", error.getMessage());
    
);

编写测试:我想要一个主节点users,有两类用户:devsemployers

Firebase usersRef  = firebase.child("users").child("devs");
    FirebaseUser user = auth.getCurrentUser();

Map<String, String> userMap = new HashMap<String, String>();
userMap.put("name", "blabla");
userMap.put("city", "Brussels");

Map<String, Map<String, String>> users = new HashMap<String, Map<String, String>>();
users.put(user.getUid().toString(), userMap);
usersRef.setValue(users);

日志:

D/AUTH LISTENER: onAuthStateChanged:signed_in:wnomkwiOWOb4wNNLSsrWeT5xxUq1
D/USER_CREATE: createUserWithEmail:onComplete:true
I/AppCompatViewInflater: app:theme is now deprecated. Please move to using android:theme instead.
D/ACTION BAR?: android.support.v7.app.ToolbarActionBar@36c3cd2a
W/SyncTree: Listen at /test failed: FirebaseError: Permission denied
D/The read failed:: Permission denied
D/FirebaseAuth: Notifying listeners about user ( wnomkwiOWOb4wNNLSsrWeT5xxUq1 ).
D/FirebaseAuth: Notifying listeners about user ( wnomkwiOWOb4wNNLSsrWeT5xxUq1 ).
D/FirebaseApp: Notifying auth state listeners.
D/FirebaseApp: Notified 0 auth state listeners.
D/AUTH LISTENER: onAuthStateChanged:signed_in:wnomkwiOWOb4wNNLSsrWeT5xxUq1
D/FirebaseApp: Notifying auth state listeners.
D/FirebaseApp: Notified 0 auth state listeners.
D/AUTH LISTENER: onAuthStateChanged:signed_in:wnomkwiOWOb4wNNLSsrWeT5xxUq1
D/COMPLETE: signInWithEmail:onComplete:true

我在公共许可下进行了这 2 个测试(写入:true,读取:true)并且它正在工作,所以我的身份验证一定有问题。我可能误解/遗漏了一些东西,但并没有真正看到究竟是什么。如果有人愿意启发我,那就太好了!

【问题讨论】:

您可以分享 Firebase 控制台中注册用户和权限选项卡的屏幕截图吗? 您在simulator 中测试过您的规则吗?如果您需要进一步的帮助,您可以在此处发布结果。此外,从您的日志看来,您每次启动应用程序时都在调用createUserWithEmailAndPasswordsignInWithEmailAndPassword。你应该使用onAuthStateChanged来检测用户是否已经登录。如果他需要创建一个“帐户”,你应该使用createUserWithEmailAndPassword,如果他已经注册并且他想登录,你应该使用signInWithEmailAndPassword @DevidFarinelli 我刚刚使用模拟器测试了规则,使用了“自定义”身份验证(因为在我的应用程序中我使用的是电子邮件/密码身份验证),并且两者都适用,所以我假设问题在于我的身份验证过程。代码来自 SignupActivity,所以这就是我每次都创建和签署用户的原因。 @LalitPoptani 这里是一些 Firebase 控制台选项卡的屏幕截图,如果您需要更多信息,请告诉我! imgur.com/a/lIxuH @DevidFarinelli 别担心,我正在处理应用程序的其他部分,所以现在,我将读/写权限设置为“true”。我的身份验证流程确实可能有问题,但不太明白是什么。顺便说一句,我的代码在 github 上,如果你想看的话:github.com/raphh11/MyApp。谢谢! 【参考方案1】:

我正在使用 com.google.firebase:firebase-admin:6.5.0。我在 firebase 中设置了以下规则。


  "rules": 
    ".read": true,
    ".write": true
  

我还在继续

PersistentConnection:pc_0 - 身份验证失败:permission_denied (访问被拒绝。)。

【讨论】:

【参考方案2】:

您将旧的 Firebase SDK 与新的 Firebase SDK 混合使用。从您的 build.gradle 中删除 firebase-android-sdk 2.5.2 并更新您的导入以使用新的 DatabaseReference 类而不是 Firebase 类。

【讨论】:

以上是关于Firebase 权限被拒绝(读取和写入)与身份验证的主要内容,如果未能解决你的问题,请参考以下文章

React/Rebase/Firebase 警告:权限被拒绝 - 如何添加用户身份验证?

与 Firebase DatabaseError 一起颤动:权限被拒绝 [重复]

Swift:Firebase 读取权限被拒绝

Firebase权限被拒绝Swift 3

Firebase 安全规则完全打开,但仍然授予权限被拒绝错误

Firebase实时数据库:DatabaseError权限被拒绝