web-dev-qa-db-ja.com

Firebaseユーザーテーブルに追加の詳細を追加する

私はfirebase + angularjsアプリで作業しており、単純なメールおよびパスワード認証を使用していますが、正常に機能しています。

Firebase email + password authで使用されているユーザーテーブルに追加のユーザーデータを追加できるかどうかだけを疑問に思っています。これらの追加データ。

37
user3440236

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)
    });
  }
});
47

注:この方法は、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);
});

additionalClaimsは、Firebaseセキュリティルールでもアクセスできます。

詳しくは Firebaseカスタムトークン

6
Hari Prasad

Firebaseには、更新はできますが追加できないユーザープロパティの固定セットがあります。

ただし、JSON.stringify() and JSON.parse()を使用して、シリアル化と逆シリアル化の助けを借りて少量のデータを追加できます。

そして、未使用のプロパティのいずれかを使用して文字列を保存します

displayNameまたはphotoURLプロパティのいずれか。追加できるデータはサイズが小さく、文字列として保存される必要があることに注意してください。

そして、これはFIREBASE SDKのメソッドを使用する場合にのみ可能であり、以下に示すようにanglefireではありません。

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を保存できます。

4
Magnus Melwin

Firebaseユーザーには、プロジェクト(ユーザー、iOS、Android、Web)が更新できるプロジェクトのユーザーデータベースに格納された固定プロパティの基本プロパティ(一意のID、プライマリメールアドレス、名前、写真URL)があります。 Firebase Userオブジェクトに他のプロパティを直接追加することはできません。代わりに、Firebase Realtime Databaseに追加のプロパティを保存できます。

3
Asad Mirza

私の答えはangular関連ではありませんが、 Polymer および Polymerfire を使用してそれを行う方法を見つけるために少し静かに検索しましたので、これを追加します私がやったよりも早く人々がそれを成し遂げるのを助ける答え.

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

それだけです。この優れた google codelab をご覧ください。これは、ポリマーでfirebaseを使用するための優れた入門書です。

2
Olivier Krull

フランクからの答えは良いですが、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");
    });
0
Mike Spear

V4.0.0ではメソッドが変更されていることに注意してください。したがって、以下のコードを使用してユーザープロファイルを取得する必要があります。

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

Swiftバージョンです。ユーザー構造( "テーブル")は次のようになります。

_--users:
-------abc,d@email,com:
---------------email:[email protected]
---------------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)
_
0
William Hu