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 提供的所有世界的方式。
当您再次登录时,用户不需要知道这一点,因为当您登录时您将重置密码,并选择一个随机密码,它将解决您的所有问题。
我认为这是最有可能的解决方案,但它不适用于生产
请更新我的情况。
| 归档时间: |
|
| 查看次数: |
310 次 |
| 最近记录: |