如何在 Google Cloud Functions 中 onCreate 触发的函数中检索tenantId

问题描述 投票:0回答:3

更新:部分解决!见下文

我已通过升级到 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
    属性,但如果我将其分配给像
    const tenantId = user.tenantId
    这样的值 租户ID在那里。
  • 注册后,我正在刷新令牌以获取其他声明,但它不存在。有时需要第二次刷新,因此添加 注册后获取新令牌之前的超时解决了这个问题。

这解决了我的问题,但不清楚,也不是有效的解决方案,仍然欢迎答案。

node.js firebase-authentication google-cloud-functions
3个回答
0
投票

在 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
来根据租户进行进一步处理或定制。

您可以查看关于云函数事件上下文的文档。


0
投票

您可以在

context.auth.token.tenantId

找到它

0
投票

对于仍在解决这个问题的任何人,我已经通过将 Firebase 社区构建器升级到最新版本来解决它。从那时起,

tenantId
属性就在
user
参数中发送。

如果您使用其他方式部署功能,请检查您的 firebase-admin 版本是否是最新的。

© www.soinside.com 2019 - 2024. All rights reserved.