【发布时间】: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