即使用户已登录,我也会收到错误消息

hch*_*hch 6 javascript firebase reactjs google-cloud-firestore

我有一个问题:我希望登录用户能够使用我的getRealtimeUsers功能。但我收到以下错误:FirebaseError: Missing or insufficient permissions.

您将在下面找到代码。一些解释:在 React 方面,我创建了一个 firebase,在getRealtimeUsers那里注册了一个函数,并尝试使用它。

firebase.js 文件

import firebase from "firebase/app";
import "firebase/firestore";

const firebaseConfig = {
    apiKey: process.env.REACT_APP_FIREBASE_KEY,
    authDomain: process.env.REACT_APP_FIREBASE_DOMAIN,
    projectId: process.env.REACT_APP_FIREBASE_PROJECT_ID,
    storageBucket: process.env.REACT_APP_FIREBASE_STORAGE_BUCKET,
    messagingSenderId: process.env.REACT_APP_FIREBASE_SENDER_ID,
    appId: process.env.REACT_APP_FIREBASE_APP_ID,
    measurementId: process.env.REACT_APP_FIREBASE_MEASUREMENT_ID
};

firebase.initializeApp(firebaseConfig);
export default firebase;

Run Code Online (Sandbox Code Playgroud)

使用我创建的 firebase 的函数:

import firebase from '../../firebase';

export const getRealtimeUsers = () => {

    return async () => {
        const db = firebase.firestore();
        const unsubscribe = db.collection("users")
        return unsubscribe;
    }
}

Run Code Online (Sandbox Code Playgroud)

功能测试

import React, { Component } from 'react';

import { connect } from 'react-redux';
import { getRealtimeUsers } from '../redux/actions/chatActions';

import firebase from '../firebase';
let unsubscribe;

class chat extends Component {
    componentDidMount() {
        unsubscribe = this.props.getRealtimeUsers()
            .then(unsubscribe => {
                return unsubscribe;
            }).catch(error => {
                console.log(error);
            });
    }
    componentWillUnmount() {
        return () => {
            unsubscribe.then(f => f()).catch(error => console.log(error));
        }
    }

    render() {

        const ref = firebase.firestore().collection("users");
        return (

                <div>
                    check if works
                </div>
        );
    }
}

const mapStateToProps = (state) => ({
});

export default connect(
    mapStateToProps,
    {
        getRealtimeUsers
    }
);

Run Code Online (Sandbox Code Playgroud)

这里我让用户做 login login.js 动作

export const loginUser = (userData) => (dispatch) => {
  axios
    .post('/login', userData)
    .then((res) => {
      console.log(res)
      setAuthorizationHeader(res.data.token);
    })
    .catch((err) => {
      console.log(err)
    });
};

Run Code Online (Sandbox Code Playgroud)

登录是在 nodejs 端完成的,这也是我将它设置为 firebase 的地方:


const config =  {
    apiKey: "WqcVU",
    authDomain: "c468.firebaseapp.com",
    projectId: "c468",
    storageBucket: "c468.appspot.com",
    messagingSenderId: "087",
    appId: "1:087:web:c912",
    measurementId: "G-SQX1"
  };
  ;

const firebase = require("firebase");
firebase.initializeApp(config);

// Log user in
exports.login = (req, res) => {
    const user = {
      email: req.body.email,
      password: req.body.password,
    };
    
    firebase
      .auth()
      .signInWithEmailAndPassword(user.email, user.password)
      .then((data) => {
        console.log(JSON.stringify(data));
        return data.user.getIdToken();
      })
      .catch((err) => {
        console.error(err);
      });
  };
app.post('/login', login);


Run Code Online (Sandbox Code Playgroud)

规则

rules_version = '2';
service cloud.firestore {
    match /databases/{database}/documents {
        match /{document=**} {
            allow read, write: if request.auth != null;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我只希望登录用户使用该getRealtimeUsers功能,但即使用户登录它也不起作用。那是我的问题。

我完全不知道如何解决它

小智 2

你的情况确实有问题,规则中安全的唯一方法是访问你的 correntUser 或 auth。因为你通过nodejs连接,所以你只返回json对象,并且不会访问这些对象。

为了能够访问这些对象,您需要做的就是再次连接,在反应本身中,与同一个 Firebase,这就是您享受 Firebase 提供的所有世界的方式。

当您再次登录时,用户不需要知道这一点,因为当您登录时您将重置密码,并选择一个随机密码,它将解决您的所有问题。

我认为这是最有可能的解决方案,但它不适用于生产

请更新我的情况。