2FA 的 Firestore 安全规则

问题描述

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

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

云 Firestore 中的当前安全规则:

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

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

解决方法

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

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

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

Option Explicit

Public Sub test2()

    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets 'loop all worksheets
        Dim HeaderName As String
        HeaderName = Join(Array("ID","GENDER","REVENUE"))
        
        Dim LastUsedCell As Range  'find last used cell of ALL columns
        Set LastUsedCell = Nothing 'initialize (because inside loop)
        Set LastUsedCell = ws.UsedRange.Find("*",xlByRows,xlPrevious)
        
        If Not LastUsedCell Is Nothing Then 'prevent error on empty sheets
            Dim HeaderRow As Range
            Set HeaderRow = ws.Range(ws.Cells(1,1),ws.Cells(1,ws.Cells.Columns.Count).End(xlToLeft))
        
            Dim Header As Variant
            For Each Header In HeaderRow
                If InStr(1,HeaderName,Header.Value,vbTextCompare) = 0 Then
                    ws.Range(ws.Cells(2,Header.Column),ws.Cells(LastUsedCell.Row,Header.Column)).Value2 = "Customer"
                End If
            Next Header
        End If
    Next ws

End Sub
,

在将这个问题提交给 google 群组寻求支持后,我找到了答案:

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...