如何向firebase.auth()添加其他信息

时间:2016-06-20 15:47:13

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

如何在此数据集中添加额外属性的电话号码和地址?似乎Firebase文档没有指定任何相关内容。

我已使用firebase.auth()

实施了登录,注册和更新

登录:

//Email Login
firebase.auth().signInWithEmailAndPassword(email, password).then(
   ok => {
        console.log("Logged in User",ok.user);              
    },
    error => {
        console.log("email/pass sign in error", error);
    }
);

注册:

 //Sign Up
firebase.auth().createUserWithEmailAndPassword(email, password).then(
    ok => {
        console.log("Register OK", ok);
    },
    error => {
        console.log("Register error", error);
    }
)

更新:

//User Authentication
firebase.auth().onAuthStateChanged(function(user) {
  if (user) {
    $scope.data=user;
  } else {
    // No user, Redirect to login page
  }
});

//Save Function
$scope.save=function(values){

    $scope.data.updateProfile({

      displayName: "Test User",
      email: "test@gmail.com",
     /* phone: 123412341,
      address: "Temp Address",*/
      photoURL: "www.example.com/profile/img.jpg"

    }).then(function() {

     // Update successful.

    }, function(error) {

     // An error happened.

    }); 

};  

3 个答案:

答案 0 :(得分:4)

据我所知,如果您想拥有比Firebase提供的默认用户更多的字段,则必须自行管理用户个人资料。

您可以在Firebase中创建引用以保留所有用户个人资料。

users: {
  "userID1": {
    "name":"user 1",
    "gender": "male" 
  },
  "userID2": {
    "name":"user 2",
    "gender": "female" 
  }
}

您可以使用onAuthStateChanged来检测用户何时登录,如果是,您可以使用once()来检索用户的数据

firebaseRef.child('users').child(user.uid).once('value', callback)

希望有所帮助

答案 1 :(得分:0)

您可以编写一些代码,这些代码结合来自firebase auth和firestore文档的数据,并将其作为单个数据实体公开给应用程序。要获得订阅并通知整个应用程序已发生更改,最好使用Rxjs之类的事件库。在下面,我使用实现事件总线的simple library编写了以下示例。

// auth.js
import { publish } from '@joaomelo/bus'
import { fireauth, firestore } from './init-firebase.js'

const authState = {
  userData: null
};

fireauth.onAuthStateChanged(user => {
  if (!user) {
    authState.userData = null;
    publish('AUTH_STATE_CHANGED', { ...authState });
    return;
  }

  // we must be carefull
  // maybe this doc does not exists yet
  const docRef = firestore
    .collection('profiles')
    .doc(user.uid);

  docRef
    // 'set' secures doc creation without 
    // affecting any preexisting data
    .set({}, { merge: true }) 
    .then(() => { 
      docRef.onSnapshot(doc => {
        // the first data load
        // and subsequent updates
        // will trigger this
        authState.userData = {
          id: user.uid, 
          email: user.email,
          ...doc.data()
        };
        publish('AUTH_STATE_CHANGED', { ...authState });
      });
    });  
});

// some-place-else.js
import { subscribe } from '@joaomelo/bus'
subscribe('AUTH_STATE_CHANGED', 
  authState => console.log(authState));

您可以在我写的post中对此进行详细说明,详细介绍该解决方案,并讨论如何更新这些属性。还有一个small library用可以检查的代码将答案与其他一些次要功能封装在一起。

答案 2 :(得分:0)

这可以通过在后端通过Admin SDK将每个用户的自定义数据作为“自定义声明”直接存储在Firebase Auth中来实现。

请注意,这不能完全在客户端完成,您的服务器(或者,如果您尚未设置服务器/ API,则可以根据链接指南使用Cloud Function)需要通过Admin SDK以使用admin.auth().setCustomUserClaims()方法安全地设置数据:

https://firebase.google.com/docs/auth/admin/custom-claims#defining_roles_via_an_http_request