如何在多租户设置中生成Firebase自定义令牌

时间:2019-11-27 07:35:25

标签: firebase google-cloud-platform firebase-authentication

我一直在尝试向我的应用程序添加对多租户的支持。

我这样初始化

const app = firebase.initializeApp();
const tenantManager = app.auth().tenantManager();
const tenant = await tenantManager.createTenant({ displayName: `test- tenant` });
const auth = tenantManager.authForTenant(tenantId);

然后,我的应用程序的一部分使用auth.createCustomToken(uid)来创建令牌,然后可以将其交换为标准id令牌(使用其余端点/accounts:signInWithCustomToken

尝试创建自定义令牌时,出现以下错误

Error: This operation is not supported in a multi-tenant context

此外,当手动创建令牌(使用jsonwebtoken和服务帐户密钥)时,错误

Specified tenant ID does not match the custom token

在尝试通过REST API验证令牌时出现

其他人是否遇到过此错误,或者有人知道在多租户环境中生成和验证自定义令牌的另一种方式(或者,是否知道以某种方式仅在给定uid的情况下将用户登录)?

2 个答案:

答案 0 :(得分:0)

当前,在多租户上下文中不支持自定义令牌身份验证。此功能仍为under construction。您可以查看受支持功能的完整列表here

答案 1 :(得分:0)

不是使用API​​来生成自定义令牌,而是使用服务帐户中的JWT生成private_key来签名并确保您具有下面定义的值

const jwt = require(`jsonwebtoken`);
const payload = {
    uid,
    sub: serviceAccount.client_email,
    tenant_id: tenantId
};
jwt.sign(payload, serviceAccount.private_key, {
    audience: `https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit`,
    issuer: serviceAccount.client_email,
    algorithm: `RS256`,
    expiresIn: 0
});

注意:有效负载中的tenant_id

现在,当通过POST交换到

以将自定义令牌交换为Firebase发行的令牌时
`https://identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken?key=${encodeURIComponent(webApiKey)}`

确保tenantId是请求的JSON正文中的属性,并且与令牌中找到的tenant_id匹配。

{
    tenantId, // Make sure this matches the "tenant_id" claim in the idToken
    token: idToken,
    returnSecureToken: true
}

第二部分记录在https://cloud.google.com/identity-platform/docs/reference/rest/client/#section-verify-custom-token中(但在撰写本文时未在原始的firebase auth文档中显示)