簡體   English   中英

在 Firebase 用戶表上添加額外的詳細信息

[英]Add Extra Details on Firebase User Table

我正在開發一個 firebase+angularjs 應用程序,我正在使用簡單的電子郵件和密碼身份驗證,它工作正常。

我只是想知道是否可以在 firebase email+password auth 使用的用戶表上添加額外的用戶數據,就像我想添加帳單信息和其他有關用戶的詳細信息,而無需在 firebase 上創建額外的節點/表來存儲這些額外的數據。

Firebase 將電子郵件/密碼用戶存儲在您無法直接訪問的單獨位置。 您無法擴展此位置中的數據。

由於許多應用程序開發人員希望在其應用程序代碼中訪問用戶數據,因此將所有用戶存儲在應用程序數據庫本身內的/users節點下是一種常見做法。 缺點是你必須自己做這件事。 但這樣做的積極方面是,您可以根據需要存儲任何額外信息。

有關示例代碼,請參閱有關存儲用戶數據Firebase 指南 從那里:

var ref = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com");
ref.onAuth(function(authData) {
  if (authData && isNewUser) {
    // save the user's profile into Firebase so we can list users,
    // use them in Security and Firebase Rules, and show profiles
    ref.child("users").child(authData.uid).set({
      provider: authData.provider,
      name: getName(authData)
    });
  }
});

注意:此方法僅適用於您使用 Firebase Admin SDK 並且您需要在服務器上具有端點來管理自定義令牌的情況

Firebase Admin SDK 可以選擇使用附加聲明對象創建自定義令牌,該對象可以包含任意數據。 這對於存儲一些與用戶相關的信息可能很有用,比如用戶是否是高級用戶。

可以使用auth對象訪問其他索賠數據。

例子

var uid = "some-uid"; //this can be existing user UID
var additionalClaims = {
   premiumAccount: true,
   some-user-property: 'some-value'
};

admin.auth().createCustomToken(uid, additionalClaims)
  .then(function(customToken) {
     // Send token back to client
  })
  .catch(function(error) {
     console.log("Error creating custom token:", error);
});

也可以在 Firebase 安全規則中訪問additionalClaims

有關更多信息,請閱讀Firebase 自定義令牌

Firebase 用戶具有一組固定的基本屬性——唯一 ID、主要電子郵件地址、姓名和照片 URL——存儲在項目的用戶數據庫中,可由用戶(iOS、Android、Web)更新。 您不能直接向 Firebase User 對象添加其他屬性; 相反,您可以將其他屬性存儲在 Firebase 實時數據庫中。

Firebase 有一組固定的用戶屬性,可以更新但不能添加到其中。

但是,您可以使用JSON.stringify() and JSON.parse()在序列化和反序列化的幫助下添加少量數據

然后使用任何一個未使用的屬性來存儲字符串

在 DisplayName 或 photoURL 屬性中。 請記住,可以添加的數據必須很小並且存儲為字符串。

這只能通過使用 FIREBASE SDK 中的方法而不是 angularfire 來實現,如下圖所示

var user = firebase.auth().currentUser;

user.updateProfile({
  displayName: "Jane Q. User",
  photoURL: "https://example.com/jane-q-user/profile.jpg"
}).then(function() {
  // Update successful.
}, function(error) {
  // An error happened.
});

您可以在這里以字符串的形式在 photoURL 或 displayName 變量中存儲更多類似 json 的數據。

我的答案與角度無關,但我安靜地搜索了一下,以了解如何使用PolymerPolymerfire來完成它,所以我添加了這個答案以幫助人們比我更快地完成它。

正如 Frank van Puffelen 提到的那樣,我不得不向 db 添加一個單獨的節點。

進口:

<link rel="import" href="../bower_components/polymerfire/firebase-app.html">
<link rel="import" href="../bower_components/polymerfire/firebase-auth.html">
<link rel="import" href="../bower_components/polymerfire/firebase-document.html">

然后在你的應用中的任何地方放置一個<firebase-app>組件:

<firebase-app
  name="yourAppName"
  api-key= "{{yourApi}}"
  auth-domain= "{{yourAuthDomain}}"
  database-url= "{{yourDbUrl}}"
>
</firebase-app>

之后,您將需要使用<firebase-auth>和 < firebase-document>

模板 :

<firebase-auth
  id="auth"
  app-name="yourAppName"
  signed-in="{{signedIn}}"
  user="{{user}}">
</firebase-auth>

<firebase-document
  id="document"
  app-name="yourAppName"
  path="{{usersPath}}"  // e.g "/users"
  data="{{userDocument}}">
</firebase-document>

腳本:

this._register = function(){
  var formValid = this.querySelector('#register-form').validate();
  var auth = this.querySelector('#auth');
  if(formValid && this.passWordsIdentic){

  //The actual registration
  auth.createUserWithEmailAndPassword(this.email, this.password).then(function(user){
    console.log('auth user registration succes');

    //Example values
    this.userDocument.uid = user.uid;
    this.userDocument.email = user.email;
    this.userDocument.firstName = this.firstName;
    this.userDocument.lastName = this.lastName;
    this.userDocument.userName = this.userName;
    this.$.document.save(this.usersPath).then(() => {
        console.log("custom user registration succes");
        this.$.document.reset();
      });
     }.bind(this)).catch(function(error) {
       var errorCode = error.code;
       var errorMessage = error.message;
       console.log('error: ', errorCode);
     );
    }
  }

就是這樣,你可能想看看這個優秀的谷歌代碼實驗室,它是一個很好的介紹如何將 firebase 與聚合物一起使用。

這是一個快速版本。 您的用戶結構(“表”)就像

--users:
-------abc,d@email,com:
---------------email:abc.d@email.com
---------------name: userName
etc.

通過 auth FIRAuth.auth()?.createUser您可以在數據庫中設置用戶,如下所示:

        let ref = FIRDatabase.database().reference()
        let rootChild = ref.child("users")
        let changedEmailChild = u.email?.lowercased().replacingOccurrences(of: ".", with: ",", options: .literal, range: nil) // Email doesn't support "," firebase doesn't support "."
        let userChild = rootChild.child(changedEmailChild!)
        userChild.child("email").setValue(u.email)
        userChild.child("name").setValue(signup.name)

請注意,該方法在 v4.0.0 中有所更改。 因此,您需要使用以下代碼來檢索用戶配置文件:

afAuth.authState.subscribe((user: firebase.User) => { 
  this.displayName = user.displayName;
  this.email = user.email;
  this.photoURL = user.photoURL;
});

Frank 的回答很好,但在 Angular6/Firebase5/Angularfire5 中有些不同:

這是我用於登錄用戶的點擊處理程序:

this.afAuth.auth.signInWithPopup(new firebase.auth.GoogleAuthProvider()).then((e) => {
      console.log("Log-In Success" + e.additionalUserInfo.profile.name);
      if (e.additionalUserInfo.isNewUser)
        this.addUserToDatabase(/*...*/);
    }).catch((error) => {
      console.log("Log-In Error: Google Sign-In failed");
    });

這是在用戶表中添加額外字段的注冊代碼

  import { AngularFireAuth } from "@angular/fire/auth";

  constructor(private firebaseAuth: AngularFireAuth){}

  registration(data: any, password: any) {
    return this.firebaseAuth.auth.createUserWithEmailAndPassword(data.Email, password)
      .then(res => {
        res.user.updateProfile({
          displayName: `${data.DisplayName}`
        })

    data.UserId = res.user.uid;
    data.PhoneNumbers = [{
      NumberType: '',
      NumberValue: ''
    }];

    data.PhotoUrl = '';
    data.Addresses = [{
      AddressLine1: '',
      AddressLine2: '',
      City: '',
      State: '',
      Country: '',
      PostalCode: '',
      AddressType: ''
    }];

    data.IsDeleted = false;
    this.fireStore.doc(`users/${res.user.uid}`).set(data);
    this.toastr.success('User has been register successfully!', 'Successfull!');
    return true;
  }).catch(err => {
    switch (err.code) {
      case 'auth/email-already-in-use':
        this.toastr.error(`Email address ${data.Email} already in use.`, 'Error!');
        break;
      case 'auth/invalid-email':
        this.toastr.error(`Email address ${data.Email} is invalid.`, 'Error!');
        break;
      case 'auth/operation-not-allowed':
        this.toastr.error('Error during sign up.', 'Error!');
        break;
      case 'auth/weak-password':
        this.toastr.error('Password is not strong enough. Add additional characters including special characters and numbers.', 'Error!');
        break;
      default:
        this.toastr.error(err.message, 'Error!');
        break;
    }
  });

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM