我尝试在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"
这是我在sdk管理员中设置自定义声明的方式
return admin.auth().setCustomUserClaims(user.uid, {
admin: true
})
答案 0 :(得分:1)
发生错误消息是因为模拟器提供的测试用户帐户未提供任何自定义声明。当前无法向模拟器表明您想要附加到模拟身份验证帐户的特定声明。模拟器仅提供有限的测试规则功能。如果您希望看到这种改善,请向Firebase support提出功能请求。
如果您希望使用功能更全面的方法来测试规则,则Firebase emulator suite将允许您编写代码以提供您希望规则在部署之前在本地进行测试的所有自定义声明。