Firebase Admin SDK:设置/合并自定义用户声明

时间:2019-08-09 11:29:42

标签: 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

结果:

{ b: 'value'}

预期结果

{ a: 'value', b: 'value' }

还是我做错了什么?

2 个答案:

答案 0 :(得分:7)

setCustomUserClaims的Firebase文档指出:

  
      
  • customUserClaims 对象
      开发者声称要设置。如果传递null,则会删除现有的自定义声明。传递大于1000个字节的自定义声明有效负载会引发错误。自定义声明将添加到用户的ID令牌,该ID令牌将在每个经过身份验证的请求上传输。对于与配置文件无关的访问相关用户属性,请使用数据库或其他单独的存储系统。
  •   

从此描述尚不完全清楚,但是语句“如果传递null,则删除现有的自定义声明”,提示每次调用[{"id":8,"name":"christoph","age":32,"number":"555-555-5555"}, {"id":9,"name":"debra","age":31,"number":"555-555-5555"}, {"id":10,"name":"eric","age":29,"number":"555-555-5555"}, {"id":19,"name":"richard","age":20,"number":"555-555-5555"}, {"id":14,"name":"santiago","age":25,"number":"(555)555-5555"}] 都将完全覆盖自定义声明。

因此,需要对自定义声明进行如下设置:

setCustomUserClaims

解决方法:claims = { a: 'value', b: 'value' } admin.auth().setCustomUserClaims(uid, claims)

可以创建一个辅助功能以合并到新的声明中。

addCustomUserClaims

答案 1 :(得分:0)

Christopher Peisert's answer是正确的,但是可以做得更干净

admin.auth().getUser(uid).then(({customClaims: oldClaims}) =>
    admin.auth().setCustomUserClaims(uid, { ...oldClaims, b: 'value' }))

如果您想将此逻辑抽象为一个函数,可以通过以下方式完成

function addCustomUserClaims(uid, claims) {
    return admin.auth().getUser(uid).then(({customClaims}) =>
        admin.auth().setCustomUserClaims(uid, { ...customClaims, ...claims }))
}

或等同于

const addCustomUserClaims = (uid, claims) => 
    admin.auth().getUser(uid).then(({customClaims}) =>
        admin.auth().setCustomUserClaims(uid, { ...customClaims, ...claims }))