Firebase 自定义声明似乎不起作用
Firebase custom claims doesn't seem to work
我的项目有问题 - Node.js 和 Firebase。
我想添加一个管理员角色,所以我根据文档使用自定义声明。
我在云函数中有 3 个函数:
exports.addAdminRole = functions.https.onCall((data, context) => {
return admin.auth().setCustomUserClaims(context.auth.uid, {
admin: true
}).then(() =>'Success!')
.catch(err => err)
})
exports.getUserRecord = functions.https.onCall((data, context) => {
return admin.auth().getUser(context.auth.uid)
.then(userRecord => userRecord.customClaims)
.catch(err => err)
})
exports.deleteAdmin = functions.https.onCall((data, context) => {
return admin.auth().setCustomUserClaims(context.auth.uid, null)
.then(() => 'Deleted admin!')
.catch(err => err)
})
我直接在客户端(http 可调用)和 addAdminRole returns 'Success!' 中调用函数,似乎可以正常工作。 getUserRecord 似乎也有效,并且 returns {admin: true} 正如我的自定义声明。
问题来了。我定义了一个函数来获取客户端的用户声明,如文档中所述:
getRecords() {
firebaseInstance.auth.currentUser.getIdTokenResult()
.then(idTokenResult => {console.log("ADMIN:", idTokenResult)})
.catch(err => console.error(err))
}
(firebaseInstance 被导入并且在整个项目中工作正常)
我不明白为什么,但是客户端的代码 returns 是一个带有声明 属性 的对象,但是这个 属性 没有我添加的管理员声明云功能。
如果我尝试像文档中那样访问 idTokenResult.claims.admin
,它会记录我未定义。
Link 到文档 - https://firebase.google.com/docs/auth/admin/custom-claims#node.js
你能向我澄清一下哪里出了问题吗?
感谢您的帮助!
用户的声明存储在他们的 ID 令牌中,SDK 每小时自动刷新一次。
从 Admin SDK 为用户配置文件设置自定义声明不会强制自动刷新客户端的 ID 令牌,因此可能需要最多一个小时才能在客户端中显示声明。文档对此进行了提示:
Once the latest claims have propagated to a user's ID token, you can get them by retrieving the ID token: ...
虽然该文档可以更明确,因此我建议您使用该页面底部的按钮留下反馈。
为确保声明尽快传播到客户端,您应该强制客户端刷新其 ID 令牌(例如,通过将 true
传递给 getIdTokenResult()
。
我的项目有问题 - Node.js 和 Firebase。
我想添加一个管理员角色,所以我根据文档使用自定义声明。 我在云函数中有 3 个函数:
exports.addAdminRole = functions.https.onCall((data, context) => {
return admin.auth().setCustomUserClaims(context.auth.uid, {
admin: true
}).then(() =>'Success!')
.catch(err => err)
})
exports.getUserRecord = functions.https.onCall((data, context) => {
return admin.auth().getUser(context.auth.uid)
.then(userRecord => userRecord.customClaims)
.catch(err => err)
})
exports.deleteAdmin = functions.https.onCall((data, context) => {
return admin.auth().setCustomUserClaims(context.auth.uid, null)
.then(() => 'Deleted admin!')
.catch(err => err)
})
我直接在客户端(http 可调用)和 addAdminRole returns 'Success!' 中调用函数,似乎可以正常工作。 getUserRecord 似乎也有效,并且 returns {admin: true} 正如我的自定义声明。
问题来了。我定义了一个函数来获取客户端的用户声明,如文档中所述:
getRecords() {
firebaseInstance.auth.currentUser.getIdTokenResult()
.then(idTokenResult => {console.log("ADMIN:", idTokenResult)})
.catch(err => console.error(err))
}
(firebaseInstance 被导入并且在整个项目中工作正常)
我不明白为什么,但是客户端的代码 returns 是一个带有声明 属性 的对象,但是这个 属性 没有我添加的管理员声明云功能。
如果我尝试像文档中那样访问 idTokenResult.claims.admin
,它会记录我未定义。
Link 到文档 - https://firebase.google.com/docs/auth/admin/custom-claims#node.js
你能向我澄清一下哪里出了问题吗? 感谢您的帮助!
用户的声明存储在他们的 ID 令牌中,SDK 每小时自动刷新一次。
从 Admin SDK 为用户配置文件设置自定义声明不会强制自动刷新客户端的 ID 令牌,因此可能需要最多一个小时才能在客户端中显示声明。文档对此进行了提示:
Once the latest claims have propagated to a user's ID token, you can get them by retrieving the ID token: ...
虽然该文档可以更明确,因此我建议您使用该页面底部的按钮留下反馈。
为确保声明尽快传播到客户端,您应该强制客户端刷新其 ID 令牌(例如,通过将 true
传递给 getIdTokenResult()
。