Firebase 云函数-用户自定义声明返回未定义
我使用带有附加声明的自定义令牌创建了一个新用户 我可以访问Firestore安全规则中的声明,但在云函数中,它返回未定义的声明。 用于创建用户的代码: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(
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对象中可用。所以不要设置用户自定义声明
看
userRecord.customClaims
获取索赔。我的uid是正确的。我记录了userRecord
显示的所有内容。但自定义声明尚未定义。你能用我用的代码检查一下吗?我认为这是一个bug。我认为只有当我使用setCustomUserClaims
设置声明时,它才有效。但是为什么我们需要覆盖在用户创建期间已经设置的声明呢createCustomToken(uid,声明)
更新了我的答案。感谢您的回答。setCustomUserClaims用于覆盖声明。但是我已经在用户创建(createCustomToken)期间设置了声明。我的问题是我可以访问Firestore安全规则中的声明,但它在云函数中返回未定义的声明。我更新了问题,请检查一下。好的。看来你的代码是正确的。你能调试一下uid是否相同吗?(在设定/获取时)。我可以正常使用userRecord.customClaims
获取索赔。我的uid是正确的。我记录了userRecord
显示的所有内容。但自定义声明尚未定义。你能用我用的代码检查一下吗?我认为这是一个bug。我认为只有当我使用setCustomUserClaims
设置声明时,它才有效。但是为什么我们需要覆盖在用户创建期间已经设置的声明呢<代码>createCustomToken(uid,声明)更新了我的答案。