gpt4 book ai didi

firebase - 如何将Firebase的身份验证链接到实时数据库?

转载 作者:行者123 更新时间:2023-12-02 22:03:40 27 4
gpt4 key购买 nike

正如标题所说。我需要将经过身份验证的用户链接到数据库。这样不同的用户只能看到自己的数据。

我已经成功实现了Firebase的身份验证功能。但记录没有保存到实时数据库,我不知道如何执行此操作。

谁能教我如何实现这样的功能吗?我尝试了数据库,我大致知道它使用(推送)创建唯一的 ID 来区分用户。但我仍然不知道如何将其与身份验证功能结合起来。

下面的代码是我的Login()和Register()函数

login (){

const validate = this.refs.formId.getValue();
if (validate) {
firebase.auth().signInWithEmailAndPassword(validate.email, validate.password)
.then(() => {
})
.catch((error) => {
const errorCode = error.code;
const errorMessage = error.message;
if (errorCode === 'auth/wrong-password') {

Toast.show({ text: `${Strings.ST30}`, position: 'bottom', buttonText: `${Strings.ST33}` })

}
else if (errorCode === 'auth/user-not-found') {

Toast.show({ text: `${Strings.ST31}`, position: 'bottom', buttonText: `${Strings.ST33}` })

}
else{
Toast.show({ text: `${Strings.ST32}`, position: 'bottom', buttonText: `${Strings.ST33}` })
}

});
}

}
register () {

const validate = this.refs.form.getValue();
if(this.validate) {
const errorHandler = ((e)=>{
console.log(e);
if(e.code == 'auth/email-already-in-use'){
Toast.show({ text: `${Strings.ST36}`, position: 'bottom', buttonText: `${Strings.ST33}` })

} else {
Toast.show({ text: `${Strings.ST32}`, position: 'bottom', buttonText: `${Strings.ST33}` })
}

})
firebase.auth().createUserWithEmailAndPassword(validate.email,validate.password).then((response) => {
firebase.auth().currentUser.updateProfile({
displayName : validate.name,
}).then(()=>{
}).catch(errorHandler);

}).catch(errorHandler)
}}

非常感谢您的时间和帮助。非常感谢!

enter image description here enter image description here enter image description here enter image description here enter image description here

编辑2:

        firebase.auth()
.createUserWithEmailAndPassword(validate.email,validate.password)
.then((response) => {
firebase.auth().currentUser.updateProfile({
displayName : validate.name,
}).then(()=>{
firebase.database()
.ref('users/' + firebase.auth().currentUser.uid + "/profile")
.set({
Username: validate.name,
UserEmail: validate.email,
CreationDate: d1.getFullYear() + "/" + (d1.getMonth() + 1) + "/" + d1.getDate()
})
}).catch(errorHandler);
}).catch(errorHandler)
}}

我已成功链接到 Firebase 实时数据库。 enter image description here

但是我无法从数据库中写入和读取其他函数。这是我对 Firebase 数据库的规则。我可以知道我应该更改哪一部分吗?

{
"rules": {
".read": false,
".write": false,
"users":
{
"$userId":
{
".read": "auth.uid === $userId",
".write": "auth.uid === $userId"
}
}
}

}

编辑3:(ExampleSendData.js)

构造函数( Prop ){ super ( Prop )
这个.状态 = { 信息: '', 消息:[] }

this.addItem = this.addItem.bind(this); }

    componentDidMount() {
firebase
.database()
.ref()
.child("messages")
.once("value", snapshot => {
const data = snapshot.val()
if (snapshot.val()) {
const initMessages = [];
Object
.keys(data)
.forEach(message => initMessages.push(data[message]));
this.setState({
messages: initMessages
})
}
});

firebase
.database()
.ref()
.child("messages")
.on("child_added", snapshot => {
const data = snapshot.val();
if (data) {
this.setState(prevState => ({
messages: [data, ...prevState.messages]
}))
}
})

}

addItem () {
if (!this.state.message) return;

const newMessage = firebase.database().ref()
.child("messages")
.push();
newMessage.set(this.state.message, () => this.setState({message: ''}))
}

render() {
return (
<View style={styles.container}>
<View style={styles.msgBox}>
<TextInput placeholder='Enter your message'
value={this.state.message}
onChangeText={(text) => this.setState({message: text})}
style={styles.txtInput}/>
<Button title='Send' onPress={this.addItem}/>
</View>
<FlatList data={this.state.messages}
renderItem={
({item}) =>
<View style={styles.listItemContainer}>
<Text style={styles.listItem}> {item}
</Text>
</View>
}

/>
</View>
);
}
}

最佳答案

根据您编写的代码,我希望您正在使用react-native-firebase?如果没有 - 你应该使用它:-)

react-native-firebase的解决方案:

一旦您注册或登录,您就可以使用 firebase.auth().currentUser 对象。该对象包含一个 uid (currentUser.uid)。然后,您可以将一些数据推送到 uid 下的数据库,例如 firebase.database().ref('users/' + firebase.auth().currentUser.uid + "/profile").set() ; 例如在您的寄存器中如下所示:

    register () {
const validate = this.refs.form.getValue();
if(this.validate) {
const errorHandler = ((e)=>{
console.log(e);
if(e.code == 'auth/email-already-in-use'){
Toast.show({ text: `${Strings.ST36}`, position: 'bottom', buttonText: `${Strings.ST33}` })
} else {
Toast.show({ text: `${Strings.ST32}`, position: 'bottom', buttonText: `${Strings.ST33}` })
}
})
firebase.auth().createUserWithEmailAndPassword(validate.email,validate.password).then((response) => {
firebase.auth().currentUser.updateProfile({
displayName : validate.name,
}).then(()=>{
firebase.database().ref('users/' + firebase.auth().currentUser.uid + "/profile").set(firebase.auth().currentUser);
}).catch(errorHandler);
}).catch(errorHandler)
}}

安全性:

我不建议在数据库中设置整个用户数据,因为您在那里不需要它。使用数据库保存用户进度或类似的东西。

安全 2:

您应该设置数据库的安全规则,只有用户可以在其数据库节点中读写。使用类似的东西:

{
"rules": {
".read": false,
".write": false,
"users":
{
"$userId":
{
".read": "auth.uid === $userId",
".write": "auth.uid === $userId"
}
}
}
}

编辑1:请尝试删除推送,因为它会生成唯一的 key ,与用户无关。再次找到您的用户数据将会很困难。并且不要使用 set 两次,因为它不起作用。 enter image description here

编辑2:您必须将想要可读/可写的节点设置为 true,如下所示:

{
"rules": {
".read": false,
".write": false,
"users":
{
"$userId":
{
".read": "auth.uid === $userId",
".write": "auth.uid === $userId"
}
},
// readable node
"messages":
{
".read": true
},
// readable and writable node
"messages":
{
".read": true,
".write": true
}
}
}

关于firebase - 如何将Firebase的身份验证链接到实时数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54330735/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com