FirebaseUI を使用してユーザ作成時に Cloud Functions の auth.user().onCreate で user.displayName がnullになっていることの対策
やりたいこと
FirebaseUIを使用して新規ユーザ登録をして、
そのイベントをCloud Functionsで拾って
Cloud Firestore の "/users" コレクションに新規 user と同じ uid のドキュメントを 追加する。
ドキュメントの email, name フィールドは、
それぞれ FirebaseUI で入力した "email", "first & lastname" と同じにする。
困ったこと
Cloud Functions のコード
下記は失敗例
import * as functions from "firebase-functions"; import * as admin from "firebase-admin"; admin.initializeApp(); functions.auth.user().onCreate(user => { const userUid = user.uid; const userEmail = user.email; const userName = user.displayName // 何故かnull const newUser = { email: userEmail, name: userName }; return admin .firestore() .collection("users") .doc(userUid) .set(newUser); });
user.uid と user.email はとれるが
user.displayName が null。どうやら仕様らしい。
https://github.com/firebase/firebase-functions/issues/95
最後のほうのコメントでfirebase-admin経由では取れる、とあったので、
試したところ取れた。
最終的なコード
import * as functions from "firebase-functions"; import * as admin from "firebase-admin"; admin.initializeApp(); // 関数をasyncにする exports.createUserDocument = functions.auth.user().onCreate(async user => { const userUid = user.uid; const userEmail = user.email; // admin.auth().getUser() 経由で取得, 取得するまでawait const authedUser = await admin.auth().getUser(userUid); const userName = authedUser.displayName; const newUser = { email: userEmail, name: userName }; return admin .firestore() .collection("users") .doc(userUid) .set(newUser); });