request.auth.uid似乎在Cloud Firestore规则中始终为null

时间:2018-05-08 02:37:29

标签: firebase firebase-authentication google-cloud-firestore firebase-security-rules

我必须在这里遗漏一些非常基本的东西...但是每当我打电话给我的Cloud Firestore数据库并尝试制定任何类型的安全规则时,它们总是会失败。

做类似

的事情



    match /users/{userId} {
      allow create, read, update: if true;
    }




有效,但显然无视这一点。但是,如果我进行任何额外的审查,例如所有文档中的首选示例,例如



    match /users/{userId} {
      allow create, read, update: if request.auth.uid != null;
    }




每次都失败了。我是否遗漏了一些关于我如何将客户端代码连接在一起的明显内容?

这是我的客户端代码,用于记录用户,然后调用db来抓取用户。 (请注意,在我的数据库中,用户的密钥是通过电子邮件发送的,而不是通过uid)



// this is a snippet from the code where I log the user in
firebase.auth().signInWithEmailAndPassword(email, FIREBASE_USER_PASSWORD)
            .then(user => {
            // the user comes back successfully logged in, 
            // I grab its uid and add it to a preparedUser object that I've been building, 
            // then pass this user to my getFirestoreUserObject function
                preparedUser.uid = user.uid;
                getFirestoreUserObject({dispatch, user: preparedUser, navigate});
            })
            
// then the getFirestoreUserObject function:
// note that all the code below works fine when there are no security rules in place

const getFirestoreUserObject = ({dispatch, user, navigate}) => {
    const {name, email, imageUrl} = user;
    // if I ask for currentUser here, I get back my logged in user
    const currentUser = firebase.auth().currentUser;

    // email is defined correctly here as the user's email
    firebase.firestore().collection('users').doc(`${email}`)
        .get() // the request fails here due to insufficient permissions
        .then(doc => {
            if (doc.exists) {
                const currentUser = doc.data();

                getUserFavorites({dispatch, currentUser, navigate});
            } else {
                createUserInFirestore({dispatch, user, navigate});
            }
        })
};




有什么明显的东西我不见了吗?如果我通过firebase.auth()注册用户,然后在通话firebase.firestore()后立即注册,那么该用户是否具有该身份验证用户的上下文?如果没有,我该如何将其传递给firestore电话?

谢谢!

4 个答案:

答案 0 :(得分:3)

经过数周的搜索,firestore和auth都可以独立工作,但不能一起工作……这是最简单的事情。

我使用的是Firebase 4.x,这是启动项目时的最新版本。然后,当我开始添加身份验证规则时,在firebase上发布了有关如何执行数据库规则的最新文档(开始时甚至都没有看过,但几个月后又准备好实现它们了) )是使用Firebase 5.y列出的。更新了我的package.json,安装了npm,一切都神奇地工作了:(

希望这可以帮助其他人...确保您至少使用的是版本5!

答案 1 :(得分:2)

我遇到了同样的问题,但最终对我有用的是通过运行 firebase cli 来更新 npm install -g firebase-tools,这反过来又更新了 cloud firestore emulator

注意:根据您使用的安装方法,可能有不同的方式更新您的 firebase cli。如果您使用 npm 安装 firebase cli,上述解决方案将起作用。有关更新 Firebase cli 的其他方法,请参阅 firebase docs

答案 2 :(得分:1)

2021 年 6 月

firebase cli 9.12.1 仍然存在问题。

必须将 firebase JS 降级到 8.3.1 才能使其正常工作,但在该版本中,它会尝试在线验证用户,而不是使用模拟器

this post

答案 3 :(得分:0)

您应该使用df[('exp', 'mean')] = df.iloc[:, -3:].mean(axis=1) print (df) week 12 exp Subject Group 1 2 3 mean 255 HD 0 117.4 104.8 87.0 103.066667 418 WT 0 61.2 56.1 97.9 71.733333 300 HD 0 111.7 126.9 118.4 119.000000 299 HD 0 50.7 37.8 30.6 39.700000 258 WT 0 56.0 67.9 58.5 60.800000 173 HD 0 76.2 131.7 119.5 109.133333 而不是df.columns = df.columns.map('_'.join) print (df) week_Subject 12_Group exp_1 exp_2 exp_3 255 HD 0 117.4 104.8 87.0 418 WT 0 61.2 56.1 97.9 300 HD 0 111.7 126.9 118.4 299 HD 0 50.7 37.8 30.6 258 WT 0 56.0 67.9 58.5 173 HD 0 76.2 131.7 119.5 df['exp_mean'] = df.iloc[:, -3:].mean(axis=1) print (df) week_Subject 12_Group exp_1 exp_2 exp_3 exp_mean 255 HD 0 117.4 104.8 87.0 103.066667 418 WT 0 61.2 56.1 97.9 71.733333 300 HD 0 111.7 126.9 118.4 119.000000 299 HD 0 50.7 37.8 30.6 39.700000 258 WT 0 56.0 67.9 58.5 60.800000 173 HD 0 76.2 131.7 119.5 109.133333

这是因为您的安全规则

firebase.firestore().collection('users').doc(`${currentUser.uid}`).get()

在确定是否提供对数据的访问权而不是用户的电子邮件时,检查用户的uid。

希望有帮助。