【问题标题】:Firestore Security Rules: How to access Tokens/Custom Auth ClaimsFirestore 安全规则:如何访问令牌/自定义身份验证声明
【发布时间】:2020-08-01 17:47:40
【问题描述】:

我尝试在我的 Firestore 规则中使用 isAdmin 函数:

function isAdmin() {
    return request.auth.token.admin == true;
    // return request.auth.token.claims.admin == true; <--- I also tried
}

但是在使用模拟器时出现错误:

错误:simulator.rules 行 [35],列 [13]。属性 admin 在对象上未定义。

我确定我正在模拟的这个用户设置了管理员令牌,因为我在前端检查了它并且它工作正常。

为什么我的规则无效?

编辑:这是我在前端(Angular)上使用的代码

  return this.auth.authState.pipe(
    take(1),
    switchMap(async (authState) => {
        if (authState) {
            const token = await authState.getIdTokenResult()
            print(token)  // log below
            if (!token.claims.admin) {
                this.router.navigate(['/auth'])
                return false
            } else {
                return true
            }
        } else {
            this.router.navigate(['/auth'])
            return false
        }
    }),
  )

这是记录令牌结果时的claims 字段:

claims:
  admin: true
  auth_time: 1596310796
  email_verified: false
  exp: 1596314396
  firebase: {identities: {…}, sign_in_provider: "password"}
  iat: 1596310796
  sub: "OuoqWiPJNUSm8x5erL0Kh6ybHX93"
  user_id: "OuoqWiPJNUSm8x5erL0Kh6ybHX93"

这就是我在 admin sdk 中设置自定义声明的方式

  return admin.auth().setCustomUserClaims(user.uid, {
    admin: true
  })

【问题讨论】:

  • 请编辑问题以在前端显示您的验证,以便我们可以看到系统的两侧。
  • 我没有看到您显示的客户端代码实际上向我们说明了客户端看到的自定义声明符合您的规则期望。我们只是看不到它是如何执行的。也许您可以添加一条日志消息,显示自定义声明的具体值。
  • @DougStevenson 我不确定你的意思是什么,缺少什么信息?客户端代码说明我可以获得一个firebase.User 对象,当我使用getIdTokenResult() 查询此用户的令牌时,我得到一个token.claims.admin 为真的对象,这表明此用户有一个自定义声明令牌@987654329 @ 设置为 true。
  • 稍等片刻 - 您正在显示来自模拟器的错误输出,但这可能与您的代码在从实际客户端应用程序访问时的运行方式无关。您是否在问如何使模拟器按您期望的方式工作?或者您在问如何使您的客户端应用程序正常工作?它们没有使用相同的底层系统运行。如果您想忽略模拟器所说的内容并专注于客户端应用程序,您的代码示例显示可以确保客户端看到自定义声明。
  • 现在,我们看到了检查声明的代码,但我们看不到您的程序的实际结果。如果您添加一行代码来记录实际声明,然后向我们展示日志中的内容,那么我们就会知道您的代码做了什么。在那之前,我们只是猜测。我们实际上并不知道您的声明是什么样的。

标签: google-cloud-firestore firebase-security


【解决方案1】:

出现错误消息是因为模拟器提供的测试用户帐户未提供任何自定义声明。目前无法向模拟器表明您希望将特定声明附加到模拟的经过身份验证的帐户。模拟器仅提供有限的测试规则能力。如果您希望看到此改进,请向Firebase support 提交功能请求。

如果您想要一种功能更全面的方法来测试您的规则,Firebase emulator suite 将允许您编写代码来提供您希望在部署之前对规则进行本地测试的任何自定义声明。

【讨论】:

    猜你喜欢
    • 2021-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-04
    • 2021-07-23
    • 1970-01-01
    • 2021-04-25
    相关资源
    最近更新 更多