如何添加 Auth 自定义声明

How to add Auth Custom claims

Firebase 函数

我正在尝试使用可调用函数将我的用户角色设置为管理员:

export const addAdminRole = functions.https.onCall(async (data, context) => {
  admin.auth().setCustomUserClaims(data.uid, {
    admin: true,
    seller: false,
  });
});

古代

下面是我在客户端调用函数的方式:

 const register = (email: string, password: string) => {
    createUserWithEmailAndPassword(auth, email, password)
      .then((userCredential) => {
        // Signed in
        const user = userCredential.user;
        const addAdminRole = httpsCallable(functions, "addAdminRole");
        addAdminRole({ email: user.email, uid: user.uid })
          .then((result) => {
            console.log(result);
          })
          .catch((error) => console.log(error));
        history.push(`/home/${user.uid}`);
      })

      .catch((error) => {
        const errorCode = error.code;
        const errorMessage = error.message;
        // ..
      });
  };

已创建用户,但未添加我的管理员角色

问题可能是因为您没有正确处理 Cloud Function 中 setCustomUserClaims() 方法返回的承诺,因此 Cloud Function 平台可能会在 CF 终止之前清理您的 CF状态。如 here in the doc.

所述,正确管理 Cloud Function 的生命周期是关键

以下应该可以解决问题:

export const addAdminRole = functions.https.onCall(async (data, context) => {
    try {
        await admin.auth().setCustomUserClaims(data.uid, {
            admin: true,
            seller: false,
          });
          
          return {result: "Success"}
    } catch (error) {
        // See https://firebase.google.com/docs/functions/callable#handle_errors
    }
  });

此外,您可以重构您的前端代码,如下正确chain the promises:

const register = (email: string, password: string) => {
    createUserWithEmailAndPassword(auth, email, password)
      .then((userCredential) => {
        // Signed in
        const user = userCredential.user;
        const addAdminRole = httpsCallable(functions, "addAdminRole");
        return addAdminRole({ email: user.email, uid: user.uid });        
      })
      .then((result) => {
        console.log(result);
        history.push(`/home/${user.uid}`);
      })
      .catch((error) => {
        const errorCode = error.code;
        const errorMessage = error.message;
        // ..
      });
  };