reactjs - Firebase onCreate 向 auth.user 添加自定义声明
问题描述
我正在尝试添加自定义声明,isRegistered 到 firebase。我的 Firestore 有另一个user
集合来保存注册信息记录。现在我试图保留一个 isRegistered 自定义声明,但我似乎无法让它工作。
exports.addRegisteredRole = functions.database.ref('/user')
.onCreate((snap, context) => {
return // **I added this later, but the issue still remains.**
admin.auth()
.setCustomUserClaims(context.auth.uid, {isRegistered: true})
.then(() => {
console.log('done', snap)
return {
message: 'done',
data: snap
}
})
.catch(err => {
console.log('something went wrong', err);
return err
})
});
我正在通过以下方式检查此声明,
currentUser.getIdTokenResult()
.then(res => {
console.log(res.claims.isRegistered)
})
(认证用户对象)。即使我重新登录它仍然未定义。我做错了什么吗,我对firebase很陌生。
解决方案
问题在于您的 onCreate 触发器。您假设您在 context.auth 对象中获取 uid,这是不正确的。
onCreate 触发器将在您的“用户”集合中添加新文档时自动触发。在这种情况下, context.aut.uid 是未定义的。您应该在函数日志中跟踪这一点。
您可以通过几种方式实现您想要做的事情
- 如果用户记录文档以用户ID作为文档名称,您可以执行以下操作
exports.addRegisteredRole =
functions.firestore
.document('test/{docId}')
.onCreate((snap, context) => {
admin.auth()
.setCustomUserClaims(snap.id, { isRegistered: true })
.then(() => {
console.log('done', snap)
return {
message: 'done',
data: snap
}
})
.catch(err => {
console.log('something went wrong', err)
return err
})
})
- 如果您使用其他名称命名用户记录文档,或者让 firebase 为您决定名称,那么您必须将 uid 作为文档数据中的属性。然后你使用 docSnapshot.data().uid 而不是 docSnapshot.id 如下
exports.addRegisteredRole =
functions.firestore
.document('test/{docId}')
.onCreate((snap, context) => {
admin.auth()
.setCustomUserClaims(snap.data().uid, { isRegistered: true })
.then(() => {
console.log('done', snap)
return {
message: 'done',
data: snap
}
})
.catch(err => {
console.log('something went wrong', err)
return err
})
})
祝你好运
推荐阅读
- c# - 无法使用 c# SmtpClient 从 Office 365 发送电子邮件
- c# - 与 HttpWebRequest 一起使用的 SOAP Web 服务对于第一个请求需要很长时间
- javascript - javascript - reverse() 数组不起作用
- c - 使用占位符作为分隔符
- vue.js - 根据设计设置高度 vuetify 文本字段
- c# - 将 GraphQL 从 .NET core 2.2 升级到 3.0
- javascript - 如何根据角度的列行总计/计算行底
- python - 使用类获取名称元素的问题
- r - 如何将.txt文件中的字符串列表转换为数据框
- java - 特殊字符上的 Java 字符相等