2FA 的 Firestore 安全规则

Firestore security rules for 2FA

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

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

Cloud Firestore 中的当前安全规则:

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

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

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

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

如果您有兴趣阅读更多内容,可以在 Firebase documentation 页面上找到下面的代码片段。

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

将这个问题带到 google 组寻求支持后,我找到了答案:

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

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

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