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

时间:2019-01-23 15:36:43

标签: firebase react-native firebase-realtime-database firebase-authentication react-native-android

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

我已经成功实现了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)

构造函数(道具){  超级道具
 this.state = {  信息: '',  讯息:[]  }

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>
        );
    }
    }

2 个答案:

答案 0 :(得分:2)

从您编写的代码中,我希望您正在使用react-native-firebase?如果不是-您应该使用它:-)

react-native-firebase解决方案:

注册或登录后,即可使用firebase.auth()。currentUser对象。该对象包括一个uid(currentUser.uid)。然后,您可以使用 firebase.database()。ref('users /'+ firebase.auth()。currentUser.uid +“ / profile”)。set()将某些数据推送到uid下的数据库。 ; 例如,在您的注册表中是这样的:

    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:

您应该设置数据库的安全规则,只有用户才能在其db节点中读写。使用类似的内容:

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

编辑1: 请尝试删除推送,因为它会生成唯一的密钥,与用户无关。很难再次找到您的用户数据。 并且不要使用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
        }
    }
}

答案 1 :(得分:0)

使用function setCjmAge登录后,您将需要获得当前用户,然后将信息写入数据库firebase.auth.getcurrentuser()firebase.database().ref('users/' + firebase.auth().currentUser.uid,如果您想将电子邮件写入数据库,还请检查设置了安全规则。