Firebase 云函数-用户自定义声明返回未定义

Firebase 云函数-用户自定义声明返回未定义,firebase,google-cloud-firestore,google-cloud-functions,Firebase,Google Cloud Firestore,Google Cloud Functions,我使用带有附加声明的自定义令牌创建了一个新用户 我可以访问Firestore安全规则中的声明,但在云函数中,它返回未定义的声明。 用于创建用户的代码: admin.auth() .createCustomToken(uid, claims) .then(token => { console.log(token); }); 用于创建用户的代码: admin.auth().getUser(uid) .then((userRecord) => { console.log(

我使用带有附加声明的自定义令牌创建了一个新用户

我可以访问Firestore安全规则中的声明,但在云函数中,它返回未定义的声明。

用于创建用户的代码:

admin.auth()
.createCustomToken(uid, claims)
.then(token => {
    console.log(token);
 });
用于创建用户的代码:

admin.auth().getUser(uid)
.then((userRecord) => { 

 console.log(userRecord.customClaims);

});

userRecord.customClaims返回未定义的

您应该使用
setCustomUserClaims()
。不是
createCustomToken()

setCustomUserClaims()
总是被覆盖,所以我建议获取当前customClaims并合并

这取决于具体情况,我建议使用async/await

像这样

async function setClaims(uid, claims) {
    try {
        const userRecord = await admin.auth().getUser(uid);
        return await admin.auth().setCustomUserClaims(uid, {
            ...userRecord.customClaims,
            ...claims
        });
    } catch (e) {
        return Promise.reject(e);
    }
}

更新
setCustomUserClaims()
设置由提供的uid标识的现有用户的其他开发人员声明

createCustomToken()
创建新的Firebase自定义令牌(JWT),该令牌可发送回客户端设备,用于使用客户端SDK的signInWithCustomToken()方法登录

您还可以选择指定要包含在自定义令牌中的其他声明。例如,下面的premiumAccount字段已添加到自定义令牌中,该令牌将在安全规则中的auth/request.auth对象中可用:

它仅在安全规则中的auth/request.auth对象中可用。所以不要设置用户自定义声明


您应该使用
setCustomUserClaims()
。不是
createCustomToken()

setCustomUserClaims()
总是被覆盖,所以我建议获取当前customClaims并合并

这取决于具体情况,我建议使用async/await

像这样

async function setClaims(uid, claims) {
    try {
        const userRecord = await admin.auth().getUser(uid);
        return await admin.auth().setCustomUserClaims(uid, {
            ...userRecord.customClaims,
            ...claims
        });
    } catch (e) {
        return Promise.reject(e);
    }
}

更新
setCustomUserClaims()
设置由提供的uid标识的现有用户的其他开发人员声明

createCustomToken()
创建新的Firebase自定义令牌(JWT),该令牌可发送回客户端设备,用于使用客户端SDK的signInWithCustomToken()方法登录

您还可以选择指定要包含在自定义令牌中的其他声明。例如,下面的premiumAccount字段已添加到自定义令牌中,该令牌将在安全规则中的auth/request.auth对象中可用:

它仅在安全规则中的auth/request.auth对象中可用。所以不要设置用户自定义声明


此代码应该有效。您应该共享整个代码,特别是创建新用户和设置声明的部分代码。@RenaudTarnec感谢您的回复。我更新了代码。请检查一下。这个代码应该可以用。您应该共享整个代码,特别是创建新用户和设置声明的部分代码。@RenaudTarnec感谢您的回复。我更新了代码。请检查一下。谢谢你的回答。setCustomUserClaims用于覆盖声明。但是我已经在用户创建(createCustomToken)期间设置了声明。我的问题是我可以访问Firestore安全规则中的声明,但它在云函数中返回未定义的声明。我更新了问题,请检查一下。好的。看来你的代码是正确的。你能调试一下uid是否相同吗?(在设定/获取时)。我可以正常使用
userRecord.customClaims
获取索赔。我的uid是正确的。我记录了
userRecord
显示的所有内容。但自定义声明尚未定义。你能用我用的代码检查一下吗?我认为这是一个bug。我认为只有当我使用
setCustomUserClaims
设置声明时,它才有效。但是为什么我们需要覆盖在用户创建期间已经设置的声明呢
createCustomToken(uid,声明)
更新了我的答案。感谢您的回答。setCustomUserClaims用于覆盖声明。但是我已经在用户创建(createCustomToken)期间设置了声明。我的问题是我可以访问Firestore安全规则中的声明,但它在云函数中返回未定义的声明。我更新了问题,请检查一下。好的。看来你的代码是正确的。你能调试一下uid是否相同吗?(在设定/获取时)。我可以正常使用
userRecord.customClaims
获取索赔。我的uid是正确的。我记录了
userRecord
显示的所有内容。但自定义声明尚未定义。你能用我用的代码检查一下吗?我认为这是一个bug。我认为只有当我使用
setCustomUserClaims
设置声明时,它才有效。但是为什么我们需要覆盖在用户创建期间已经设置的声明呢<代码>createCustomToken(uid,声明)更新了我的答案。