首页 > 解决方案 > 使用 React、Redux 和 Firebase 登录时检查用户自定义声明(是管理员)

问题描述

我想知道是否有人可以帮助我。

我目前正在构建一个管理仪表板,只能由管理员访问。我正在使用 React、Redux 和 Firebase。

我已经设法在云功能中为特定用户设置自定义声明,如下所示:

exports.addSuperAdminRole = functions.https.onCall((data, context) => {
  return admin.auth().getUserByEmail(data.email).then(user => {
    return admin.auth().setCustomUserClaims(user.uid, {
      superAdmin: true
    })
  }).then(() => {
    return {
      message: `Success! ${data.email} has been made an admin.`
    }
  }).catch(err => {
    return err;
  });
});

我现在只想限制超级管理员对仪表板的访问,并且想知道什么是最好的(最安全的)方法来做到这一点。

目前,我有以下客户端登录操作,我在其中检查自定义声明,如果用户不是管理员,则只需注销用户:

export const login = creds => {
  return async (dispatch, getState, { getFirebase }) => {
    const firebase = getFirebase();
    try {
      await firebase
        .auth()
        .signInWithEmailAndPassword(creds.email, creds.password);

        const currentUser = firebase.auth().currentUser;
        currentUser.getIdTokenResult().then(idTokenResult => {
          console.log(currentUser);
          currentUser.superAdmin = idTokenResult.claims.superAdmin;

          if (!currentUser.superAdmin) {
            console.log('is not admin');
            firebase.logout();
          }
        });

    } catch (error) {
      console.log(error);
      throw new SubmissionError({
        _error: 'Login failed'
      });
    }
  };
};

这是否足够,还是我需要在登录时运行云功能,检查声明,然后注销用户?如果是这样,将如何做到这一点?

您能给我的任何帮助将不胜感激!

干杯,

詹姆士

标签: reactjsfirebasefirebase-authenticationgoogle-cloud-functionsfirebase-security

解决方案


import firebase from 'firebase/app';  // this works with npm install firebase


firebase.auth().currentUser.getIdTokenResult()
  .then((idTokenResult) => {
     // Confirm the user is an Admin.
     if (!!idTokenResult.claims.admin) {
       // Show admin UI.
       showAdminUI();
     } else {
       // Show regular user UI.
       showRegularUI();
     }
  })
  .catch((error) => {
    console.log(error);
  });

资源:https ://firebase.google.com/docs/auth/admin/custom-claims


推荐阅读