4

私はこれが初めてなので、我慢してください。電子メールとパスワードを使用して、fire base simple login を使用しようとしています。私はこれで作業しています:

var authClient = new FirebaseAuthClient(fireRef, function(error, user) {
          if (error) {
            // an error occurred while attempting login

                if(error.code === "INVALID_EMAIL"){ 
                    $('#log_email_error').hide();
                    $('#log_pass_error').hide();
                    $('#log_email_error').html("Invalid email specified.").fadeIn();
                    $('.login_button').removeClass('login_button_success').attr('value','Log in');          
                }
                if (error.code === "INVALID_PASSWORD") {
                    $('#log_email_error').hide();
                    $('#log_pass_error').hide();
                    $('#log_pass_error').html("The specified password is incorrect..").fadeIn();
                    $('.login_button').removeClass('login_button_success').attr('value','Log in');
                }


            console.log(error);
          } else if (user) {
            // user authenticated with Firebase
            hideLogin();
            $('.userInfo_cont').show();
            $('.userInfo').html('<div> '+  user.email + ' <span class="grey">| </span> </div>');
            $('.logout').on('click',function(){
                authClient.logout();
            });

            console.log('User ID: ' + user.id + ', Provider: ' + user.provider);

          } else {
            // user is logged out
            $('.userInfo_cont').hide();
            showLogin();
          }
    });

しかし、ユーザーが登録するとき、私は登録でこれを行うことができるいくつかの追加情報をfirebase/usersエリアに保存したいと思います:

$('#submit_reg').on('click',function(){
            var firstName = $('#regFirstname').val();
            var lastName = $('#regLastname').val();
            var email = $('#regUsername').val();
            var password = $('#regPassword').val();

            authClient.createUser(email, password, function(error, user) {
              if (!error) {
                   console.log('User Id: ' + user.id + ', Email: ' + user.email);

                       authClient.login('password', {
                                          email: email,
                                          password: password,
                                          rememberMe: false
                                        });


                       hideLogin();


                        userInfo = {

                            userId : user.id,
                            firstName : firstName,
                            lastName : lastName,
                            email : user.email

                        }

                        var url = USERS_LOCATION + "/" + user.id;
                        var userRef = new Firebase(url);

                        console.log(userInfo);

                        userRef.set(userInfo);



                  }else{
                    //display error

                    alert(error);

                  }
            });



        });

私の問題は、ドキュメントにあるような読み書きルールを実装するときです。

{
  "rules": {
    "users":{
     "$userid": {
        ".read": "auth.id == $userid",
        ".write": "auth.id == $userid"
      }
    }
  }
}

ユーザーが登録すると、許可が拒否されます。したがって、ユーザーは問題なく登録されますが、追加データは /users/id 領域に書き込まれません。

どんな助けでも大歓迎です。

クレイグ

4

1 に答える 1

5

上記のスニペットでは、 を呼び出しlogin()、その後すぐに呼び出していset()ます。メソッドは非同期であり、ログイン試行メソッドが返される前にメソッドlogin()を呼び出すことがほぼ常に保証されているため、これは問題があります。これは、非ブロッキングでありながら Firebase サーバーへのネットワーク呼び出しを行うためです。set()login()

login()これは、正しい電子メール アドレスとパスワードで電話をかけているにもかかわらず、認証プロセスが完了する前にデータを設定しようとしていることを意味します。

ログインしているユーザーを呼び出して検出set()したときに渡したコールバックなど、ユーザーが既に認証されていることが確実な場合にのみ実行されるブロックにロジックを移動することをお勧めします。new FirebaseAuthClient()

于 2013-03-12T23:46:07.350 に答える