更新:部分解决!见下文
我已通过升级到 Identity Platform 将 Firebase 应用程序转换为多租户,并且我需要在
onCreate
函数中获取tenantId。
// This is where it's defined;
exports.processSignUp = functions.auth.user().onCreate(events.signUp);
这就是函数,我尝试了各种方法来获取tenantId。
async function signUp(user, context) {
let tenantId = user.tenantId; //context?.auth?.token?.firebase?.tenant;
try {
Logger.debug("USEROBJ", user);
Logger.debug("USEROBJ-2", JSON.parse(JSON.stringify(user)));
Logger.debug("CONTEXTOBJ", context);
Logger.debug("CONTEXTOBJ-2", JSON.parse(JSON.stringify(context)));
if (!tenantId) {
Logger.error("TENANT ID IS EMPTY", "Assigned manually.");
tenantId = "xxxx-xxxx";
}
} catch (error) {
console.error(error);
}
//Set Custom Claims on Firebase
return (
_createUserClaims(user.uid, user.email)
//Read claims from store & update user's claims.
.then(() => _updateClaims(tenantId, user.uid))
);
}
索赔创建功能
//Merge custom claims with default claims.
const createClaimsObject = (uid, additionalClaims) => {
const defaultClaims = {
"x-hasura-default-role": "user",
"x-hasura-allowed-roles": ["user"],
"x-hasura-user-id": uid,
};
const claims = {
"https://hasura.io/jwt/claims": {
...defaultClaims,
...additionalClaims,
},
};
return claims;
};
此功能应该更新声明,但失败了。
function updateClaims(admin, firestore, tenantId, uid) {
//
return getClaims(firestore, uid)
.then((doc) => checkClaims(uid, doc))
.then((additionalClaims) => setClaims(admin, tenantId, uid, additionalClaims))
.catch((err) => console.error(err));
}
这是检查 Firestore 的索赔记录。
//Check if claims exist.
const checkClaims = async (uid, doc) => {
if (doc) {
const data = doc.data();
console.log(`${uid} has custom claims`, data);
return data;
}
return {};
};
这是我的索赔设置功能;
const setClaims = async (admin, tenantId, uid, additionalClaims) => {
const claims = createClaimsObject(uid, additionalClaims);
return admin
.auth()
.tenantManager()
.authForTenant(tenantId)
.setCustomUserClaims(uid, claims);
};
手动设置后,setClaims返回this;
FirebaseAuthError: There is no user record corresponding to the provided identifier.
如何检索租户 ID,即使我手动设置,为什么会失败并出现此错误?
怎么解决的?
我不太清楚为什么会解决这个问题,但我会在这里解释一下它是如何解决的。
此行更新如下admin.initializeApp(functions.config().firebase);
admin.initializeApp();
- 另一件事是,当我记录
对象时,没有user
属性,但如果我将其分配给像tenantId
这样的值 租户ID在那里。const tenantId = user.tenantId
- 注册后,我正在刷新令牌以获取其他声明,但它不存在。有时需要第二次刷新,因此添加 注册后获取新令牌之前的超时解决了这个问题。
这解决了我的问题,但不清楚,也不是有效的解决方案,仍然欢迎答案。
在 Google Cloud Functions 中由
tenantId
触发的函数中检索 onCreate
,您可以通过 context
函数的 onCreate
参数访问它。
定义您的云函数以用于创建用户:
exports.processSignUp = functions.auth.user().onCreate((user, context) => {
const tenantId = context.auth.tenantId || "defaultTenantId";
// In the logic of your function, use the tenantId.
//...
});
使用
tenantId
访问 context.auth.tenantId
。如果不可用,您可以提供默认值。
在函数逻辑中使用
tenantId
来根据租户进行进一步处理或定制。
您可以查看关于云函数事件上下文的文档。
您可以在
context.auth.token.tenantId
找到它
对于仍在解决这个问题的任何人,我已经通过将 Firebase 社区构建器升级到最新版本来解决它。从那时起,
tenantId
属性就在user
参数中发送。
如果您使用其他方式部署功能,请检查您的 firebase-admin 版本是否是最新的。