Как связать аутентификацию Firebase с базой данных в реальном времени? - PullRequest
0 голосов
/ 23 января 2019

Как сказано в названии. Мне нужно связать аутентифицированного пользователя с базой данных. Так что другой пользователь может видеть только свои данные.

Я успешно реализовал функцию аутентификации Firebase. Но запись не сохраняется в базе данных реального времени, и я не знаю, как это сделать.

Может кто-нибудь, пожалуйста, научите меня, как я могу сделать такую ​​функцию? Я попробовал базу данных, и я примерно знаю, что она использует (push) для создания уникального идентификатора, чтобы дифференцировать пользователя. Но я все еще не знаю, как объединить это с функцией аутентификации.

Следующий код является моей функцией входа в систему () и регистрации ()

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

1 Ответ

0 голосов
/ 24 января 2019

Исходя из кода, который вы пишете, я ожидаю, что вы используете response-native-firebase?Если нет - вы должны использовать его :-)

Решение для Reaction-native-Firebase:

Как только вы зарегистрированы или вошли в систему, вы можете использовать FireBase.auth (). currentUser Object.Этот объект включает в себя 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: Пожалуйста, попробуйте удалить push, поскольку он генерирует уникальный ключ, который не имеет ничего общего с пользователем.Будет трудно снова найти ваши пользовательские данные.И не используйте set дважды, так как он не будет работать.enter image description here

Редактировать 2: Вы должны установить узлы, которые вы хотите, чтобы быть читаемыми / записываемыми, чтобы истина, как это:

{
    "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
        }
    }
}
...