l2a*_*lba 2 node.js firebase firebase-authentication firebase-admin
Firebase是否有任何技巧{ merge: true }可以设置额外/更多自定义声明而不删除/覆盖旧变量?
复制步骤:
admin.auth().setCustomUserClaims(uid, { a: 'value' }) // Run this first
admin.auth().setCustomUserClaims(uid, { b: 'value' }) // Then run this after
Run Code Online (Sandbox Code Playgroud)
结果:
{ b: 'value'}
Run Code Online (Sandbox Code Playgroud)
预期结果:
{ a: 'value', b: 'value' }
Run Code Online (Sandbox Code Playgroud)
还是我做错了什么?
Firebase setCustomUserClaims状态文件:
- customUserClaims:Object
开发人员声明要设置。如果传递null,则会删除现有的自定义声明。传递大于1000个字节的自定义声明有效负载会引发错误。自定义声明将添加到用户的ID令牌,该ID令牌将在每个经过身份验证的请求上传输。对于与概要文件不相关的访问用户属性,请使用数据库或其他单独的存储系统。
从此描述尚不完全清楚,但是“如果传递null,则删除现有的自定义声明”这样的语句表明,每次调用,自定义声明都会被完全覆盖setCustomUserClaims。
因此,需要将自定义声明设置如下:
claims = {
a: 'value',
b: 'value'
}
admin.auth().setCustomUserClaims(uid, claims)
Run Code Online (Sandbox Code Playgroud)
addCustomUserClaims可以创建一个辅助功能以合并到新的声明中。
async function addCustomUserClaims(uid, claims) {
const user = await admin.auth().getUser(uid)
let updated_claims = user.customClaims || {}
for (let property in claims) {
if (Object.prototype.hasOwnProperty.call(claims, property)) {
updated_claims[property] = claims[property]
}
}
await admin.auth().setCustomUserClaims(uid, updated_claims)
}
Run Code Online (Sandbox Code Playgroud)
Christopher Pesert 的答案是正确的,但可以做得更干净,因为
admin.auth().getUser(uid).then(({customClaims: oldClaims}) =>
admin.auth().setCustomUserClaims(uid, { ...oldClaims, b: 'value' }))
Run Code Online (Sandbox Code Playgroud)
如果你想把这个逻辑抽象成一个函数,可以这样做
function addCustomUserClaims(uid, claims) {
return admin.auth().getUser(uid).then(({customClaims}) =>
admin.auth().setCustomUserClaims(uid, { ...customClaims, ...claims }))
}
Run Code Online (Sandbox Code Playgroud)
或等效*为
const addCustomUserClaims = (uid, claims) =>
admin.auth().getUser(uid).then(({customClaims}) =>
admin.auth().setCustomUserClaims(uid, { ...customClaims, ...claims }))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
163 次 |
| 最近记录: |