将身份验证数据添加到firebase数据库

时间:2016-10-19 10:27:13

标签: javascript firebase firebase-realtime-database firebase-authentication

我在学校项目中使用Firebase,我有一段时间遇到同样的问题......我看了很多网站,但找不到有同样问题的人......

用户身份验证工作正常,但问题在于将用户数据保存在数据库中。 我有两种可用的身份验证方式:

  • 电子邮件和密码;
  • 主页。

使用电子邮件和密码,数据已成功写入数据库,我使用以下JavaScript代码:

function signUp(){
    //Get DOM data
    const email = String(document.getElementById('TXTEmail').value);
    const pass = String(document.getElementById('TXTPassword').value);
    const name = String(document.getElementById('TXTNome').value);
    const gender = document.registo.sexo.value;
    const auth = firebase.auth();
    var promise = auth.createUserWithEmailAndPassword(email,pass);
    promise.catch(e => console.log(e.message));

    firebase.database().ref('users/' + firebase.auth().currentUser.uid).set({
        name : name,
        email : email,
        gender : gender,
        uid: firebase.auth().currentUser.uid
    });
}

然而,当使用facebook的功能我无法保存数据时,我只能验证用户,我正在使用的代码如下:

function signUpFacebook(){
        var provider = new firebase.auth.FacebookAuthProvider();
        firebase.auth().signInWithRedirect(provider);
        firebase.auth().getRedirectResult().then(function(result) {
            if (result.credential) {
                // This gives you a Facebook Access Token. You can use it to access the Facebook API.
                var token = result.credential.accessToken;
            }
            // The signed-in user info.
            var user = result.user;
            const name = user.displayName;
            const email = user.email;
            const photo = user.photoURL;
            if(user != 0) {
                firebase.database().ref('users/' + user.uid).set({
                    name: nome,
                    email: email,
                    photo: photo,
                    uid: user.uid
                });
            }
            //Tests only
            if(user != 0){
                console.log("name: "+user.displayName);
                console.log("email: "+user.email);
                console.log("photoUrl: "+user.photoURL);
                console.log("uid: "+user.uid);
            }
        }).catch(function(error) {
            // Handle Errors here.
            var errorCode = error.code;
            var errorMessage = error.message;
            // The email of the user's account used.
            var email = error.email;
            // The firebase.auth.AuthCredential type that was used.
            var credential = error.credential;

        });
    }

我在控制台上输出了这个输出: Console output

name: Rafael Veloso 
email: rafael****@gmail.com 
photoUrl: scontent.xx.fbcdn.net/v/t1.0-1/s100x100/… 
uid: **HY43Tl******KoO6OhZjG****

另外,我的database.rules.json是:

{
  "rules": {
    ".read": true,
    ".write": true
  }
}

有谁知道我有什么问题? 谢谢。

1 个答案:

答案 0 :(得分:0)

在Firebase支持的帮助下,我设法解决了我的问题:)

首先,在.html文档中创建一个脚本:

<script>
document.getElementById('btnFacebook').addEventListener('click', signUpFacebook, false);

function signUpFacebook(){
    var provider = new firebase.auth.FacebookAuthProvider();
    firebase.auth().signInWithRedirect(provider);
}

function createNewPost(name, email, photo, uid) {
    firebase.database().ref('users/' + uid).set({
        name: name,
        email: email,
        photo: photo,
        uid: uid
    });
}

firebase.auth().getRedirectResult().then(function(result) {
    if (result.credential) {
        var token = result.credential.accessToken;
    }
    // The signed-in user info.
    if(user != null) {
        console.log("name: "+user.displayName);
        console.log("email: "+user.email);
        console.log("photoUrl: "+user.photoURL);
        console.log("uid: "+user.uid);
    }

}).catch(function(error) {
    // Handle Errors here.
    var errorCode = error.code;
    var errorMessage = error.message;
    // The email of the user's account used.
    var email = error.email;
    // The firebase.auth.AuthCredential type that was used.
    var credential = error.credential;

});

firebase.auth().onAuthStateChanged(function(user) {
    if (user) {
        var name = user.displayName;
        var email = user.email;
        var photo = user.photoURL;
        var uid = user.uid;
        createNewPost(name, email, photo, uid);
        console.log("name: "+user.displayName);
        console.log("email: "+user.email);
        console.log("photoUrl: "+user.photoURL);
        console.log("uid: "+user.uid);
    }
});

有了这个,我仍然无法将用户数据添加到实时数据库,所以我改变了我的“导入”,我就是这样:

<script src="https://www.gstatic.com/firebasejs/3.2.1/firebase-app.js"></script>
<script src="https://www.gstatic.com/firebasejs/3.2.1/firebase-auth.js"></script>
<script src="https://www.gstatic.com/firebasejs/3.2.1/firebase-database.js"></script>
<script src="https://www.gstatic.com/firebasejs/3.5.0/firebase-messaging.js"></script>
<script src="https://www.gstatic.com/firebasejs/3.2.1/firebase.js"></script>

只有当我更改为以下内容时,我才能将用户数据保存在数据库中:

<!--    <script src="https://www.gstatic.com/firebasejs/3.2.1/firebase-app.js"></script>
<script src="https://www.gstatic.com/firebasejs/3.2.1/firebase-auth.js"></script>
<script src="https://www.gstatic.com/firebasejs/3.2.1/firebase-database.js"></script>
<script src="https://www.gstatic.com/firebasejs/3.5.0/firebase-messaging.js"></script>-->
<script src="https://www.gstatic.com/firebasejs/3.2.1/firebase.js"></script>

但我发现这很奇怪,任何人都可以帮助并解释为什么会有效吗?