【问题标题】:Firestore security rules for 2FA2FA 的 Firestore 安全规则
【发布时间】:2021-04-21 02:01:17
【问题描述】:

我正在使用 Firebase 构建无服务器应用:Firestore 和云功能。我一直在努力解决的一件事是如何验证用户是否启用了 2FA 以允许访问某些功能。 已注册 Google Identity Platform 以允许 2FA,遗憾的是我找不到强制 2FA 的选项。

我的安全规则要求是:登录、验证电子邮件、使用 2FA 进行身份验证。

Cloud Firestore 中的当前安全规则:

request.auth != null && request.auth.token.email_verified

据我搜索request.auth.token.phone_number 可以检查,但这仅检查用户是否注册了电话号码,而不检查他们是否有 2FA 登录?

【问题讨论】:

    标签: google-cloud-firestore firebase-authentication firebase-security google-identity


    【解决方案1】:

    将此问题提交给谷歌群组寻求支持后,我找到了答案:

    if request.auth.token.firebase.get('sign_in_second_factor', null) == 'phone'
    && 'second_factor_identifier' in request.auth.token.firebase;
    

    如果用户将手机作为 2FA,这将允许访问。

    您可以在 google 群组中查看 Sam 的原作:https://groups.google.com/g/firebase-talk/c/7EZfxETa_jk/m/4e0FRCpWAgAJ

    【讨论】:

      【解决方案2】:

      Google 去年在 March 中为 Google Cloud Identity Platform 项目添加了多因素身份验证支持。例如,要对用户进行身份验证,您可以构建代码以包含以下步骤:

      1. 重新验证,用户;
      2. 要求用户输入他们的电话号码;
      3. 初始化:reCAPTCHA 验证器;
      4. 为用户获取多因素会话;
      5. 初始化:带有用户电话号码和多因素会话的 PhoneInfoOptions 对象;
      6. 向用户手机发送验证信息;
      7. 如果请求失败,重置reCAPTCHA;
      8. 要求用户验证短信验证码;
      9. 初始化:MultiFactorAssertion 对象;
      10. 完成注册;

      如果您有兴趣了解更多信息,可以在 Firebase documentation 页面上找到下面的代码 sn-p。

      var recaptchaVerifier = new firebase.auth.RecaptchaVerifier(container);
      user.multiFactor.getSession().then(function(multiFactorSession) {
        // Specify the phone number and pass the MFA session.
        var phoneInfoOptions = {
          phoneNumber: phoneNumber,
          session: multiFactorSession
        };
        var phoneAuthProvider = new firebase.auth.PhoneAuthProvider();
        // Send SMS verification code.
        return phoneAuthProvider.verifyPhoneNumber(
            phoneInfoOptions, recaptchaVerifier);
      })
      .then(function(verificationId) {
        // Ask user for the verification code.
        var cred = firebase.auth.PhoneAuthProvider.credential(verificationId, verificationCode);
        var multiFactorAssertion = firebase.auth.PhoneMultiFactorGenerator.assertion(cred);
        // Complete enrollment.
        return user.multiFactor.enroll(multiFactorAssertion, mfaDisplayName);
      });
      

      【讨论】:

      • 我知道这一点,这些步骤指示如何允许用户注册 2FA,但它不包括如何检查是否从安全规则中启用了 2FA。在我的应用程序中,只有启用 2FA 才能写入 Firestore 中的某些文档,我将如何在安全规则中检查?
      • 您可以为该特定文档创建自定义声明属性和角色,并授予对该特定角色的访问权限(启用 2FA 的用户)。 firebase.google.com/docs/rules/…
      猜你喜欢
      • 2018-10-19
      • 2019-07-05
      • 2020-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多